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