我一直在寻找一种更有效的方法来查找特定频率下信号的幅度和相位,而无需执行 FFT,因为它产生的信息比我需要的多,我在 Matlab 留言板上看到了这条评论:
http://www.mathworks.com/matlabcentral/newsreader/view_original/250421。
如果我以 1500Hz 采样并且我的信号是 100 个点并且我正在寻找 15Hz 的相位和幅度,这是否适合获取我需要的信息的方法?另外,为什么 OP 还建议对信号进行窗口化?
我一直在寻找一种更有效的方法来查找特定频率下信号的幅度和相位,而无需执行 FFT,因为它产生的信息比我需要的多,我在 Matlab 留言板上看到了这条评论:
http://www.mathworks.com/matlabcentral/newsreader/view_original/250421。
如果我以 1500Hz 采样并且我的信号是 100 个点并且我正在寻找 15Hz 的相位和幅度,这是否适合获取我需要的信息的方法?另外,为什么 OP 还建议对信号进行窗口化?
它肯定在计算正确的东西。虽然不是
sum(x.*(cos(1000*2*pi*t)-i*sin(2*pi*1000*t)))*2/N;
你可以试试
sum(x.*exp(-i*2*pi*1000*t))*2/N;
如果您需要做一些类似的事情,但在线(而不是批量),您可能需要查看Goertzel 算法。正如维基百科链接所说:
.. 提供了一种有效评估离散傅里叶变换各个项的方法
这种方法并没有什么特别“快”的地方,所以它实际上只是计算一个 DFT bin。
的点 DFT可以计算为:
k = 3;
N = 10;
x = [0:N-1];
X = sum(x.*exp(-i*2*pi*k*[0:N-1]/N));
其中 bin 频率由
如果您希望像在 STDFT 中那样定期加班,您可以使用滑动 DFT 或滑动 Goertzel(更便宜)[1]。滑动 Goertzel 本质上是一个梳状滤波器(延迟设置为个样本),后跟一个二阶 IIR。样本的复频谱系数。
本文还描述了如何通过将相邻的 bin 与窗口的 DFT 进行卷积来执行频域窗口。例如,可以通过以下方式获得第
希望有帮助。
[1] 埃里克·雅各布森和理查德·莱昂斯。滑动 DFT。IEEE 信号处理杂志,卷。20,第 2 期。(2003 年 3 月),第 74-80 页。
[2] http://newsgroups.derkeiler.com/Archive/Comp/comp.dsp/2005-11/msg00862.html