关于理解信号中包含的幅度

时间:2014-12-29 12:02:01

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

我只是想知道并理解为什么信号 x1 具有最高幅度,而信号 x2 具有最低幅度为如下图所示?

当我运行代码时,我希望看到x1的最低振幅x2的中等振幅,x3具有最高的振幅,因为,如公式所示在下方,x1乘以10,x2等于x1加上另一个幅度为10,依此类推。

请您澄清这些要点。

enter image description here

2 个答案:

答案 0 :(得分:2)

信号x3包含三个具有相同幅度但频率不同的余弦。因此,理想情况下,频谱应包含三个具有相同幅度的狄拉克脉冲。只有在我们对信号进行无限长的观察时才会出现这种情况。我们已经开窗了#34;信号由多个L=8000个样本组成。你"切出" 8000个样本,就像信号与矩形信号相乘。一个矩形的光谱是一个由主瓣和几个较小的旁瓣组成的正弦脉冲。

因此,您将获得x3的频谱将是具有正弦冲动的3个狄拉克斯的卷积。这正是您在绘制DTFT时得到的结果:

enter image description here

DFT是DTFT的采样版本。 k DFT频率enter image description here定义为

enter image description here

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

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

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

enter image description here

您还会看到实际频率和测量频率之间的最大差异(f2)导致DFT中的最小峰值。频率的舍入误差保持小于enter image description here,即它随着DFT长度的增加而减小。

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

答案 1 :(得分:0)

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,3enter image description here 作为参考,我以最小采样率报告原始时间信号,如上面的代码,即f_sample+1 Hz。此外,采样频率必须大于f_sample 1)以避免欠采样,并尊重香农定理; 2)整数,在0s1s之间均匀分布离散样本,即为了得到周期信号。

注意缺少t = 1的最后一点: enter image description here