【问题标题】:Can FFT length affect filtering accuracy?FFT长度会影响滤波精度吗?
【发布时间】:2011-06-01 19:58:16
【问题描述】:

我正在设计一个分数延迟滤波器,我的 5 h(n) 阶拉格朗日系数在时域中有 6 个抽头。我已经测试过使用 matlab 将 h(n) 与 x(n) 进行卷积,这是 5000 个采样信号,结果似乎还可以。当我尝试使用 FFT 和 IFFT 方法时,输出完全错误。实际上,我的 FFT 是用频域中的 8192 个数据计算的,这是 5000 个信号样本的最接近 2 的幂。对于 IFFT 部分,我将 8192 频域数据转换回时域中的 5000 长度数据。所以,问题是,为什么这个东西在卷积中起作用,但在 FFT 乘法中不起作用。在频域中将我的 6 个抽头 h(n) 转换为 8192 个抽头会导致这个问题吗?

实际上,我已经尝试过使用重叠保存方法,该方法执行 FFT 并与较小的 x(n) 块相乘,并分别执行 5 次。结果似乎比以前稍微好一点,至少我可以看到波形模式,但仍然略有失真。因此,任何想法哪里出了问题,以及解决方案是什么。谢谢。

我在频域而不是时域实现循环卷积的原因是,我尝试将拉格朗日滤波器与频域中的其他低通滤波器合并,以便实现更高效。当然,我确实相信在频域中实现滤波将比在时域中的卷积快得多。 LP 滤波器在时域中有 120 个抽头。由于内存限制,包括填充在内的原始数据长度将被限制为 1024,fft bin 也是如此。

因为我的拉格朗日系数只有 6 个抽头,这与 1024 个抽头有很大不同。我怀疑频域中 6 个抽头到 1024 个 bin 的 fft 会导致错误。这是我关于拉格朗日滤波器的 matlab 代码。这只是一个测试代码,不是实现代码。有点乱,抱歉。如果你能给我更多关于这个问题的建议,我真的很感激。谢谢。

t=1:5000;
fs=2.5*(10^12);
A=70000;

x=A*sin(2*pi*10.*t.*(10^6).*t./fs);

delay=0.4;
N=5;

n = 0:N;  
h = ones(1,N+1);  

for k = 0:N  
      index = find(n ~= k);  
      h(index) = h(index) *  (delay-k)./ (n(index)-k);  
end  

pad=zeros(1,length(h)-1);  
out=[];  
H=fft(hh,1024);  
H=fft([h zeros(1,1024-length(h))]);  
for i=0:1:ceil(length(x)/(1024-length(h)+1))-1  

    if (i ~= ceil(length(x)/(1024-length(h)+1))-1)  
        a=x(1,i*(1024-length(h)+1)+1:(i+1)*(1024-length(h)+1));  
    else  
        temp=x(1,i*(1024-length(h)+1)+1:length(x));  
        a=[temp zeros(1,1024-length(h)+1-length(temp))];  
    end  

    xx=[pad a];
    X=fft(xx,1024);


    Y=H.*X;
    y=abs(ifft(Y,1024));
    out=[out y(1,length(h):length(y))];
    pad=y(1,length(a)+1:length(y));  

end

【问题讨论】:

  • 根据您的描述,您尝试的第一种技术应该有效。你能发布你的代码吗?为什么你认为结果是错误的?此外,对于 6 抽头 FIR 滤波器,重叠保存处理可能没有太大优势。但是如果你想看一个例子,这里的第二个代码块可能会很有趣:stackoverflow.com/questions/2929401/…
  • 您的代码无法运行,因为 hhx 未定义。

标签: signal-processing fft convolution


【解决方案1】:

一些cmets:

  1. 最接近的 2 次方实际上是 4096。您认为剩余的 904 个样本贡献很大吗?我猜它们只有在您寻找频率相对较低的特征时才有意义。
  2. 如何将信号填充到 8192 个样本?将样本填充到 8192 意味着大约 40% 的数据是“虚构的”。如果您使用零来延长数据集,您可能会在填充点处注入阶跃变化 - 这意味着大量高频内容。
  3. 一个简短的代码 sn-p 演示您的方法不会受到伤害。

【讨论】:

  • 我真的想知道为什么 OP 觉得需要填充,当现代方法(例如 FFTW 中的实现(MATLAB 现在在内部使用))现在能够有效地处理不是权力的长度时2 个。
  • 当您使用 FFT/IFFT 进行过滤时,您只是在时间上使用循环卷积的等效性与频率的乘法,因此您需要填充以避免循环卷积的回绕。您不会查看频谱系数,而只是将它们用于快速数学运算。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 2011-09-13
  • 1970-01-01
  • 2017-08-02
  • 2010-12-05
  • 1970-01-01
相关资源
最近更新 更多