通过对信号执行FFT,将部分信号归零,然后执行IFFT来过滤信号非常容易。例如:



t = linspace(0, 1, 256, endpoint=False)
x = sin(2 * pi * 3 * t) + cos(2 * pi * 100 * t)
X = fft(x)
X[64:192] = 0
y = ifft(X)


该“砖墙” FFT滤波器完全消除了高频分量。

但是我听说这不是一个好方法。


为什么通常这是个坏主意?
在某些情况下这是一个好的选择吗?

#1 楼

频域中的归零仓与频域中的矩形窗相乘相同。频域中窗口的乘积与时域中该窗口的变换的循环卷积相同。矩形窗口的变换是Sinc函数($ \ sin(\ omega t)/ \ omega t $)。请注意,Sinc函数具有许多较大的波纹,并且这些波纹会扩展时域孔径的整个宽度。如果可以输出所有这些纹波(振铃)的时域滤波器是一个“坏主意”,则归零箱也是如此。或FFT孔径宽度中的非整数周期。因此,如果您的原始FFT输入数据是该窗口中某些非周期性数据(例如,大多数非同步采样的“真实世界”信号)上的一个窗口,则这些特定的伪像将由归零仓产生。另一种看待它的方法是,每个FFT结果仓在时域中代表一定频率的正弦波。因此,将仓归零将产生与减去该正弦波相同的结果,或者等效地,添加一个具有精确FFT仓中心频率但相位相反的正弦波。请注意,如果时域中某些内容的频率在FFT宽度上不是纯粹的整数周期,则尝试通过添加正整数周期正弦波的逆来消除它,不会产生静默,而是看起来更像“拍子”音符(不同频率的AM调制正弦波)。同样,可能也不需要。相反,如果您的原始时域信号只是几个纯粹的未调制正弦波,这些正弦波在FFT孔径宽度中都是正整数周期的,则对FFT零位进行零位处理删除没有伪像的指定对象。

评论


$ \ begingroup $
这个答案有很多用处,但是我更希望把重点放在吉布斯效应上。
$ \ endgroup $
– Jim Clay
2012年12月10日在2:04

$ \ begingroup $
这里已经有人试图获得吉布斯效应的答案:dsp.stackexchange.com/questions/1144/…
$ \ endgroup $
– hotpaw2
2012-12-10 2:45

$ \ begingroup $
@ hotpaw2这是一个很好的解释。但是,我需要对此进行参考,并且在确定一个方面遇到了一些困难。这是我们进行时域滤波而不是在频域工作的原因。 (此外,时域可以是实时的。)但是,似乎没有人从声明这一点开始!
$ \ endgroup $
–休
18年2月17日在8:55

$ \ begingroup $
这与过滤器设计的窗口方法有何关系?
$ \ endgroup $
–Filipe Pinto
19年5月17日在11:47

$ \ begingroup $
比较Von Hann窗口(等)的变形与任何矩形窗口的变形。通常,滤波器的响应要好得多,尤其是在阻带中的FFT区间之间。通常,将零位突然置零比在过渡附近未置零更糟糕。
$ \ endgroup $
– hotpaw2
19年5月17日在13:58



#2 楼

这个问题也让我很困惑。 @ hotpaw2的解释很好。
您可能对使用matlab的简单实验感兴趣。

https://poweidsplearningpath.blogspot.com/2019/04/dftidft.html


更新了信息。

要验证这一事实是否简单,我们只需要仔细观察理想的(?)带通滤波器的脉冲响应频谱即可,该滤波器只是归零FFT分档。为什么需要“谨慎”添加副词?如果我们仅使用相同大小的FFT来观察脉冲响应,就会被欺骗,如图1所示。尽管如此,如果在观察滤波器的输出时添加DFT的阶数,即零填充脉冲响应,我们可以发现所谓的吉布斯现象,即频域的波纹,如图2所示。

结果实际上来自开窗效应。如果您想完全理解问题,请参阅DSP(1)圣经的7.6章和10.1-10.2章。总结起来,这里要指出三个关键点。


窗口大小和DFT(FFT)的顺序是完全独立的。请勿将它们混合在一起。
窗口的属性(类型/大小)主导DTFT的形状。 (例如,更宽的主瓣导致频率响应中更宽的瞬变带。)
DFT只是DTFT在频域中的采样。而且,DFT的阶数越高,DFT的频谱越密集。

因此,借助图2中更密集的频谱,我们可以看到理想(伪)波段的蒙版通过过滤器。

欺骗频率。响应。

Freq中的吉布斯现象。回应。

(1)艾伦·奥本海姆和罗纳德·W·谢弗。 2009。离散时间信号处理(第3版)。美国新泽西州上萨德尔河Prentice Hall出版社。

fps = 15;

LPF = 1;
HPF = 2;

n = -511:512;
n0 = 0;
imp = (n==n0);

NyquistF = 1/2*fps;

%% Ideal BPF
tmp_N = 512;
tmp_n = 0:1:tmp_N-1;
freq = ( n .* fps) ./ tmp_N;
F = fft(imp, tmp_N);  
F_bpf = IdealBandpassFilter(F, fps, LPF, HPF);
imp_rep =[real(ifft(F_bpf))'];

% Zero padding.
imp_rep2 =[zeros(1,2048) real(ifft(F_bpf))' zeros(1,2048)];

N = 2^nextpow2(length(imp_rep));
F = fft(imp_rep,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Mis leading Freq Response');


N = 2^nextpow2(length(imp_rep2));
F = fft(imp_rep2,N);
freq_step = fps/N;
freq = -fps/2:freq_step:fps/2-freq_step;
freq = freq(N/2+1:end)';

figure;
plot(freq,abs(F(1:N/2)));
xlabel('freq(Hz)');
ylabel('mag');
title('Zero Padding (DFT) with more points');

%% Function
function filered_signal = IdealBandpassFilter(input_signal, fs, w1, w2)

    N = length(input_signal);
    n = 0:1:N-1;
    freq = ( n .* fs) ./ N;

    filered_signal = zeros(N, 1);

    for i = 1:N
        if freq(i) > w1 & freq(i) < w2
            filered_signal(i) = input_signal(i);
        end

    end
end


#3 楼

FFT的时间分辨率差,即在特定时间存在的时间没有给出信息。它给出了有关给定信号持续时间的现有频率分量的信息。

通过FFT中的归零仓在时域IFFT之后给出较差的分辨率。

评论


$ \ begingroup $
但是,要让很长的信号先进行fft再进行ifft,存在计算困难。为了避免抖动/振铃,信号的滤波必须从通带平稳过渡到阻带。
$ \ endgroup $
– Itta Gouthami
18-4-5在5:58



$ \ begingroup $
“ FFT的时间分辨率很差” FFT没有时间分辨率,它是频谱域变换,因此,正如后面所说,它仅给出有关信号频率分量的信息。
$ \ endgroup $
– EdParadox
19年8月5日在15:11

$ \ begingroup $
FFT提供的分辨率是其窗口的长度。 FFT窗口之外的任何内容都无法解析为FFT窗口内的任何内容。
$ \ endgroup $
– hotpaw2
19年8月31日在5:50