傅立叶变换:获得mag +相位,然后使用它们绘制原始信号

时间:2013-11-13 00:01:05

标签: matlab fft ifft

你好我正在研究简单的信号,我想计算信号的傅里叶变换,得到幅度和相位,然后从中重建原始信号。

我的代码基于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的新手,所以如果我犯了一些随机的愚蠢错误,我会道歉。如果你们能指出我正确的方向,我将不胜感激。谢谢。

2 个答案:

答案 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的顺序)。