非整数遅延フィルターを設計しています。私のラグランジュ係数は 5 h(n) で、時間領域に 6 つのタップがあります。matlab を使用して 5000 サンプリングされた信号である x(n) で h(n) をたたみ込むことをテストしましたが、結果は問題ないようです。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