FFT长度会影响滤波精度吗?

时间:2010-12-31 01:06:13

标签: signal-processing fft convolution

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

实际上我尝试过使用重叠保存方法,它使用较小的x(n)块执行FFT和乘法,并分别进行5次。结果似乎比之前略好,至少我可以看到波形图案,但仍然略微扭曲。所以,任何想法出错的地方,解决方案是什么。谢谢。

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

因为我的拉格朗日系数只有6个抽头,这与1024个抽头有很大不同。我怀疑在频域中6个抽头到1024个频段的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

1 个答案:

答案 0 :(得分:0)

一些意见:

  1. 最近的2的幂实际上是4096.你是否期望剩余的904个样本贡献很多?我猜想只有在寻找相对低频的功能时才有意义。
  2. 您是如何将信号填充到8192个样本中的?将样本填充到8192意味着大约40%的数据是“虚构的”。如果你使用零来延长你的数据集,你可能会在垫点注入一个阶跃变化 - 这意味着很多高频内容。
  3. 显示您的方法的简短代码段不会受到伤害。