从FFT中提取信号的频率

时间:2013-04-10 06:36:42

标签: matlab diff fft frequency spectrum

我是 Matlab FFT 的新手 我需要从幅度和频率不同的信号中提取主频率。我尝试执行 detrend 然后执行 FFT 以获得频率,但无法摆脱0Hz处的大峰值(直流分量?)。我在信号上使用 diff 函数,结果信号通过 FFT 处理。在这种情况下, FFT 输出的峰值不为零。我比较了两条 FFT 曲线,看起来除了零点处的峰值,两者显示相似(不相同)的光谱。我想知道 diff 函数是否是一种有效(且非常有效)的去趋势方法,还是我在这里丢失了一些信息?换句话说,区分信号对其频率有什么影响:[diff(sin(omega.t))= cos(omega.t) - 频率没有变化]?

非常感谢!

2 个答案:

答案 0 :(得分:2)

通过区分信号,您实际应用了一种高通滤波器,一种不那么聪明的高通,会破坏您的信号。相反,您可以尝试其他一些过滤器,如下所示:

b=fir1(32,2*0.01/fs,'high');
a=1;
FilteredX=filtfilt(x,a,b)

其中:

x是您的原始信号,

FilteredX是过滤后的信号。

fs - 您的采样频率。

通过这种方式,您可以滤除低于0.01的任何频率,并且几乎不会伤害其他频谱,从而可以按照您的意愿检测峰值。

答案 1 :(得分:1)

信号X的离散傅里叶变换x

定义(直至缩放)
X(k) = Sum[ exp(2*pi*i*k*n/N) * x(n) ]

如果我们首先获得信号的差异

Sum[ exp(2*pi*i*k*n/N) * (x(n) - x(n-1)) ]

你可以重新安排给予

(1 - exp(2*pi*i*k/N)) * Sum[ exp(2*pi*i*k*n/N) * x(n) ]

即。它是原始傅立叶变换的倍数。在k = 0情况下(即零频率分量),乘数为零,这解释了为什么这会消除k = 0处的尖峰。

但请注意,乘数取决于k的值,因此您不会获得相同的信号 - 您不能仅仅采用第一个差异来消除尖峰。可以与连续傅立叶变换进行比较,其中如果 g = F(f) h = F(df / dx)那么

h(k) = i * k * g(k)

即。导数的傅里叶变换是原函数的傅立叶变换,乘以 ik