你好我正在研究简单的信号,我想计算信号的傅里叶变换,得到幅度和相位,然后从中重建原始信号。
我的代码基于this线程。
代码:
>> 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的新手,所以如果我犯了一些随机的愚蠢错误,我会道歉。如果你们能指出我正确的方向,我将不胜感激。谢谢。
答案 0 :(得分: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:你有时会得到非零虚部的不良结果(例如,如果S=pi
),你需要像Luis建议的那样绘制stem(real(x_i))
或stem(1:length(x_i),x_i)
。
答案 1 :(得分: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
的行为一致(另请参阅this question的答案)
所以只需用x_i
分别绘制stem
的实部虚部。您会看到真实部分按预期再现x
,虚部可忽略不计(eps
的顺序)。