为什么 MATLAB fft cos 产生虚部?

信息处理 fft 傅里叶变换 自由度 阶段 余弦
2022-02-15 18:12:19

cos 傅立叶变换没有虚部,但在这段代码中,它的虚部很小。

在此处输入图像描述

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数字( 7);

fs=128;

t=-4*pi:1/fs:4*pi-1/fs;

x=1*cos(0.5*t);

X=fft(x);

N=长度(x);

n=0:N-1;

f=n*fs/N;

phs=角度(fftshift(X));

子图(2,1,1);plot(f,abs(fftshift(X))/N,'LineWidth',1.5);

标题('FFT');ylabel('幅度'); xlabel('频率(Hz)');

子图(2,1,2);绘图(f,phs*180/pi,'-o');xlabel('频率(Hz)');

ylabel('相位(度)');

图(8);

重新=真实(X);我=图像(X);

子图(2,1,1);茎(f,重新);ylabel('Re(G(f))'); xlabel('频率(Hz)');

子图(2,1,2);茎(f,Im);ylabel('Im(G(f))'); xlabel('频率(Hz)'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

如果我将时间范围设为 0.5 的倍数,则虚部的结果值很小,即 e-14~15。

让我知道为什么会出现这个问题...

1个回答

FFT 之后的那些误差项是典型的舍入误差...除此之外,您应该正确地将余弦框成一个完全周期性的长度,就像您所做的那样,那么您可以期望虚部是在数字格式允许的范围内尽可能接近零。请注意,累积的 FFT 舍入误差随着 FFT 块长度 N 的平方根而增长;因此 FFT 块越长,累积的 FFT 误差越大。1015

以下 OCTAVE / MATLAB 代码行显示了帧长度(又称孔径大小)对 FFT 计算的影响:

L = 16   ; period of cosine
N = 128  ; frame length of sample block (integer multiple of L)
figure,stem(imag(fft(cos(2*pi*[0:N-1]./L),N))); title('imaginary part of the FFT');

在此处输入图像描述

现在让我们更改余弦的周期,以使帧不包含确切的周期数:

L = 15  ; period of cosine
N = 128  ; frame length of sample block (non-integer multiple of L)
figure,stem(imag(fft(cos(2*pi*[0:N-1]./L),N))); title('imaginary part of the FFT');

在此处输入图像描述

现在,如果您的结果显示的偏差比第一个图上发现的偏差更多,那么您的帧长度可能是问题所在。另一方面,如果您在第一个图中观察到非常接近零(可能是随机分布)的值,那么这可能是由于 FFT 计算中涉及的数值舍入误差。