【发布时间】:2013-03-27 01:24:27
【问题描述】:
我的问题是基于反 fft 从幅度谱 (fft) 中获取原始信号,但仅适用于某些频率范围。 8-12赫兹。有人可以帮我吗?我尝试使用:
xdft=fft(x);
ixdft=ifft(xdft(a:b)), %where xdft(a:b) is |Y(f)| for freq 8-12 Hz.
但它不想工作。
【问题讨论】:
我的问题是基于反 fft 从幅度谱 (fft) 中获取原始信号,但仅适用于某些频率范围。 8-12赫兹。有人可以帮我吗?我尝试使用:
xdft=fft(x);
ixdft=ifft(xdft(a:b)), %where xdft(a:b) is |Y(f)| for freq 8-12 Hz.
但它不想工作。
【问题讨论】:
您可以将xdft 的所有值设置为零,除了您想要的值,即,
xdft = fft(x);
xdft = xdft(1:ceil(length(xdft) / 2));
xdft(1:a) = 0;
xdft(b+1:end) = 0;
ixdft = ifft(xdft, 'symmetric');
我只采用原始 FFT 数据的一半的原因是,您的结果将关于 Fs / 2(其中 Fs 是采样率)对称,并且如果您不对频率做同样的事情在中心的任何一侧,您都会得到一个复杂的信号。我没有手动对两边做同样的事情,而是取了一侧,修改了它,并告诉ifft 它必须通过附加你传递的镜像来重建整个频率范围的数据;这是通过使用 'symmetric' 选项调用它来完成的。
如果您需要确定某个频率的 a 和 b 应该是什么,您可以首先创建一个您已执行 FFT 的频率向量,然后找到您范围内的那些频率,就像这样:
xdft = fft(x);
xdft = xdft(1:ceil(length(xdft) / 2));
f = linspace(0, Fs / 2, length(xdft));
keepInd = f >= 8 & f <= 12; % Keep frequencies between 8 and 12 Hz
xdft(~keepInd) = 0;
请注意,在此示例中,我实际上完全省略了a 和b 这两个变量的使用,而是选择了逻辑索引,Fs 是采样率。
【讨论】: