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);

我完全得到不同的图表。

编辑:我实际上这样做是为了测试如果相位改变会发​​生什么信号。因此,我将需要相位角来再次构建信号。

我对 Fourier + Matlab 还是新手,所以如果我犯了一些随机的愚蠢错误,我深表歉意。如果你们能指出我正确的方向,我将不胜感激。谢谢你。

4

2 回答 2

2

该问题是由 中的舍入误差引起的phase,因此在计算相位角的正弦和余弦时不要使用它们。相反,使用 trig 身份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 S=pi),您将需要绘制stem(real(x_i))或者stem(1:length(x_i),x_i)按照 Luis 的建议进行绘制。

于 2013-11-13T00:31:23.620 回答
2

FFT 中不存在这种数值不稳定性。问题是舍入误差在恢复信号中给出了一个非常小的虚部x_i。这很正常。的实部x_i正确再现x,而虚部x_i很小。你可以检查stem(real(x_i))stem(imag(x_i))

现在stem(x_i)有了复杂x_i的情节,虚部与实部。另一方面,stem(1:length(x_i),x_i)(或当然stem(real(x_i)))绘制 的实部x_i。请注意,这与plot的行为一致(另请参阅此问题的答案)

x_i因此,只需分别绘制 的实部虚部stem。您会看到实部x按预期重现,而虚部可忽略不计(大约 0 次eps)。

于 2013-11-13T00:37:57.070 回答