【问题标题】:Regarding understanding the amplitude contained in a signal关于理解信号中包含的幅度
【发布时间】:2015-02-25 14:49:03
【问题描述】:

我只是想知道为什么信号 x1 的幅度最高,而信号 x2 的幅度最低,如下图所示图片?

当我运行代码时,我希望看到幅度最小的x1,中等幅度的x2,幅度最大的x3,因为如下面的等式所示,x1 是乘以 10 和 x2 等于 x1 加上另一个幅度 10,依此类推。

请澄清这些要点。

【问题讨论】:

  • x3 由三个具有相同幅度 (10) 但频率不同(3、20 和 50 Hz)的余弦信号组成。我认为频谱图中幅度的差异是由于数据是离散的。

标签: matlab signal-processing fft wavelet wavelet-transform


【解决方案1】:

信号x3 包含三个幅度相同但频率不同的余弦。因此,理想情况下,频谱应该包含三个幅度相同的狄拉克脉冲。只有当我们对信号进行无限长的观察时,才会出现这种情况。我们有由数字L=8000 样本组成的“窗口化”信号。您“切掉”了 8000 个样本,这就像将信号与矩形信号相乘一样。一个矩形的频谱是一个 sinc 脉冲,由一个主瓣和几个较小的旁瓣组成。

因此,您将获得 x3 的频谱将是 3 个狄拉克与 sinc 脉冲的卷积。这正是绘制 DTFT 时得到的结果:

DFT 是 DTFT 的采样版本。 k DFT 频率 定义为

其中N 是 DFT 的长度。这就是您的问题所在:您使用N=8192fs=8000 计算DFT。因此,您不会达到精确的频率f1f2f3。最接近“真实”峰值的点将是

f1 = 2.9297 Hz
f2 = 19.5313 Hz
f3 = 49.8047 Hz

因此,您在 DFT 中看到的峰值小于应有的值。

您还看到,实际频率与测量频率之间的最大差异(f2)导致 DFT 中的最小峰值。频率的舍入误差仍然小于,即随着 DFT 长度的增加而减小。

长话短说:对于周期性信号,您可以调整 DFT 长度以确保 DFT 达到实际频率(正如@gg349 在他的回答中所建议的那样)。一般情况下,可以将DFT长度N加长,得到更小的舍入误差,更接近DTFT。要获得更好的 DTFT 从而提高频率分辨率,您必须增加数据长度L

【讨论】:

  • “只有当我们有无限的信号样本时才会出现这种情况”。这是根本错误的。只要信号是周期性的,DFT 就是一个很好的工具,它可以准确地提取谐波的幅度。我认为使用矩形窗口来讨论谐波的幅度并不是最好的主意。最后的建议不是最好的选择,因为您不需要很多样本。
  • 如果您将自己仅限于周期性信号,那么您的 cmets 和您的答案是正确且合理的。我的回答中的陈述应该适用于任何任意信号。为了澄清,“无限样本”是指无限长的观察,而不是无限的采样频率。
  • 问题与周期信号有关。您可能需要澄清这一点
【解决方案2】:

x1,x2,x3 在 3 个不同频率处分别有 1,2 和 3 个谐波,所有谐波的幅度都为10。当您在频域中研究这些信号时,您期望 x1,x2,x3 分别呈现 1,2 和 3 个峰值,并且所有峰值都具有相同的幅度。所以x13Hz 有1 个峰值(假设我们在这里讨论时间),x3 在频率3,20,50Hz 有3 个峰值。

尽管我刚才说过,如果您在不选择特定观察窗口的情况下绘制傅立叶变换的绝对值,您会发现例如x3,3 个频率的 3 个峰值的高度不同。这可以在x3 的右上角以及@hbaderts 的回答中看到,这并不能真正解决您的问题。发生这种情况是因为您的时间向量 t 不是信号周期的倍数,这会导致您得到一个非周期性(或至少不是周期性)的信号 x3(或x1,x2)以您认为的方式),并且您不能再期望上述内容受到尊重,因为更多的频率分量会涂抹这张图片。

由于您是在生成信号而不是从传感器加载信号,因此您可以更改观察窗口t,以便信号在该窗口中是周期性的。在这种情况下,所需的观察窗口是1 秒(因此每个周期t1,t2,t3 包含在1s 中的整数次)。然后,您可以在t=0t=1 之间选择多个等距点,不包括最后一个点,即在[0,1) 范围内。

唯一需要讨论的是采样频率,它必须高于信号最高频率的两倍。在这种情况下,最高频率。是fmax = 50,所以我们需要在fs=100Hz以上采样,以解决所有谐波。我们还需要采样频率为自然数,否则01 之间的离散点将不等距,信号将不具有周期性。

下面是python中的一个例子,留给你在Matlab中调整:

from numpy import arange, cos
from numpy.fft import rfft, rfftfreq
import matplotlib.pyplot as plt

f1, f2, f3 = 3., 20., 50.  # in Hz
T1, T2, T3 = 1 / f1, 1 / f2, 1 / f3
T_all = 1
# From Shanon theoreom we must use a sampling freq. larger than this:
f_sample = 2 * max([f1, f2, f3])
# we also need to use an integer sampling frequency, or the
# points will not be equispaced between 0 and 1. We then add +1 to f_sample:
dt = 1 / (f_sample + 1)
t = arange(0, T_all, dt)
# another way of generating the points, without fixing the sampling frequency
# follows. In this case one must check that 1 / dt > f_sample afterwards
# t, dt = linspace(0, T_all, 2000, endpoint=False, retstep=True)
x3 = 1 * cos(2 * pi * f1 * t) + 2 * cos(2 * pi * f2 * t) + 3 * cos(2 * pi * f3 * t)

y = rfft(x3)
freqs = rfftfreq(t.size, d=dt)  # in Hz

fig, ax = plt.subplots() # we plot the abs. value of the fft:
# the factor 2/t.size is the normalizing factor between peaks
# of the DFT and original amplitudes in time domain.
ax.plot(freqs, 2 * abs(y) / t.size, 'o')
ax.set_ylim(0, 3.5)
ax.set_xlabel('f  [Hz]')
ax.grid()
fig.show()

我们发现离散 DFT 实际上仅在指定频率处显示非零值。通过适当地重新调整结果,我们还恢复了谐波的确切幅度,在此示例中选择为1,2,3。 作为参考,我以上面代码中的最小采样率报告原始时间信号,即f_sample+1Hz。此外,采样频率必须 1) 大于f_sample 以避免欠采样,并尊重香农定理; 2)一个整数,在0s1s之间均匀分布离散样本,即为了有一个周期信号。

注意 t=1 的最后一个点是如何丢失的:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2015-11-09
    相关资源
    最近更新 更多