0

こんにちは、私は単純な信号に取り組んでおり、信号のフーリエ変換を計算し、振幅と位相を取得して、そこから元の信号を再構築したいと考えています。

このスレッドに基づいてコードを作成しています。

コード:

>> n=0:99;
>> N=length(n);
>> x = sin((2*pi/N).*n).*cos((pi/N).*n);
>> F = fft(x);
>> mag =  sqrt(real(F).^2 + imag(F).^2);
>> phase = atan2(imag(F),real(F));
>> re = mag .* cos(phase);
>> im = mag .* sin(phase);
>> F_i = re + 1i*im;
>> x_i = ifft(F_i);
>> figure;stem(x);figure;stem(x_i);

私は完全に異なるグラフを取得します。

編集: 位相が変化した場合に信号に何が起こるかをテストするために、実際にこれを行っています。したがって、これにより、信号を再度構築するために位相角が必要になります。

私はフーリエ + Matlab の両方にまだ慣れていないので、ランダムなばかげた間違いを犯していたら申し訳ありません。皆さんが私を正しい方向に向けることができれば幸いです。ありがとうございました。

4

2 に答える 2

2

この問題は の丸め誤差が原因で発生するphaseため、位相角の正弦と余弦を計算するときに丸め誤差を使用しないでください。代わりに、トリガー ID cos(atan(A))=(1+A^2)^(-1/2)、および などsin(atan(A))=A*(1+A^2)^(-1/2)を使用します。

re = mag .* real(F)./sqrt(real(F).^2+imag(F).^2);
im = mag .* imag(F)./sqrt(real(F).^2+imag(F).^2);

編集:位相角を で変更したい場合はS、これでうまくいくと思います:

re = mag .* (real(F)*cos(S)-imag(F)*sin(S))./sqrt(real(F).^2+imag(F).^2);
im = mag .* (real(F)*sin(S)+imag(F)*cos(S))./sqrt(real(F).^2+imag(F).^2);

EDIT2:ゼロ以外の虚数部( if など)で悪い結果が得られる場合があり、またはLuisが提案したようS=piにプロットする必要があります。stem(real(x_i))stem(1:length(x_i),x_i)

于 2013-11-13T00:31:23.620 に答える