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