2010-12-31 16 views
1

私はフラクショナル遅延フィルタを設計しており、5 h(n)のラグランジュ係数は時間領域で6タップです。私は、MATLABを使用して5000サンプリングされた信号であるx(n)でh(n)を畳み込むようにテストしました。私はFFTとIFFTメソッドを使用しようとしたとき、出力は完全に間違っています。実際に私のFFTは、周波数領域で8192データで計算されます。これは、5000信号サンプルの2の最も近い累乗です。 IFFT部分については、私は8192の周波数領域のデータを時間領域の5000の長さのデータに戻して変換します。だから問題は、なぜこのことがコンボリューションで機能するのですが、FFTの乗算では機能しません。周波数領域で6タップh(n)を8192タップに変換するとこの問題が発生しますか?FFTの長さはフィルタリング精度に影響を及ぼしますか?

実際には、x(n)の小さなチャンクでFFTと乗算を行い、別々に5回実行するオーバーラップセーブメソッドを使用しようとしました。結果は以前のものよりやや良いように見えますが、少なくとも私は波形パターンを見ることができますが、まだ少し歪んでいます。だから、どこが間違っているのか、解決策は何か。ありがとうございました。

時間領域の代わりに周波数領域で循環畳み込みを実装するのは、Lagrangeフィルタを周波数領域の他の低域フィルタとマージしようとしているため、実装が効率的になるためです。もちろん、周波数領域でのフィルタリングの実装は、時間領域での畳み込みよりはるかに高速です。 LPフィルタは、時間領域において120タップを有する。メモリの制約のため、パディングを含む生データは長さが1024に制限され、したがってfftビンも制限されます。

私のラグランジェー係数はわずか6タップであるため、1024タップと大きく異なります。私は、6タップのfftが周波数領域で1024ビンになるとエラーを引き起こすのではないかと疑います。ここで私の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 
+0

あなたの説明から、あなたが試した最初の手法が有効だったはずです。あなたのコードを投稿して、結果が間違っていると思うのはなぜですか?また、6タップのFIRフィルタの場合、おそらくオーバーラップセーブ処理にはあまり効果がありません。しかし、例を見たい場合は、ここで2番目のコードブロックが興味深いかもしれません:http://stackoverflow.com/questions/2929401/dsp-filtering-in-the-frequency-domain-via-fft/2949227#2949227 – mtrw

+0

あなたは 'hh'と' x'が定義されていないので、コードは実行されません。 – mtrw

答えて

0

いくつかのコメント:

  1. 最も近い2の電源が実際にある4096あなたは残りの904個のサンプルはあまり貢献することを期待しますか?私は、あなたが比較的低周波の特徴を探している場合にのみ重要であると推測します。
  2. 8192サンプルに信号をどのように埋め込みましたか? 8192にサンプルをパディングすると、データの約40%が「架空の」ものであることを意味します。データセットを長くするためにゼロを使用した場合は、パッドポイントでステップ変更を注入する可能性があります。これは高頻度のコンテンツが多いことを意味します。
  3. あなたのメソッドを示す短いコードスニペットが傷つけることはありませんでした。
+0

FFTWの実装(MATLAB内部で使用されている)のような現代的な方法が、2の累乗ではない長さを効率的に処理できるようになったときに、OPがパッドの必要性を感じているのはなぜですか? –

+0

FFT/IFFTをフィルタリングするには、周波数の乗算を使用して時間内の循環畳み込みの等価性を使用しているだけなので、循環畳み込みから回避することができます。あなたは、スペクトル係数を見ないでしょう、あなたは高速な計算にそれらを使用しています。 – mtrw

関連する問題