N = 256; % X = 1/N*fftshift(fft(x,N)); X = 1/N*fft(x,N); df = fs/N; sampleIndex =-N/2:N/2-1; f=sampleIndex*df; figure(2); stem(f,abs(X)); xlabel('f(Hz)'); ylabel('|X(k)|'); phase_ =atan2(imag(X),real(X))*180/pi; figure(3); plot(f,phase_); X2=X; threshold=max(abs(X))/10000; X2(abs(X)<threshold)=0; phase_ =atan2(imag(X2),real(X2))*180/pi; figure(4); stem(f,phase_); p = max(phase_);代码解释
时间: 2023-06-17 21:03:52 浏览: 118
Why use fftshift(fft(fftshift(x))) instead of fft(x) in Matlab
这段代码是进行离散傅里叶变换(DFT)并绘制频谱图和相位谱图。具体解释如下:
- N = 256;:指定DFT的点数为256。
- X = 1/N*fftshift(fft(x,N));:对长度为N的x序列进行DFT,fftshift将频谱移到中心,再除以N得到归一化后的频谱X。
- X = 1/N*fft(x,N);:同上,但没有移动频谱。
- df = fs/N;:计算采样率为fs时,每个频率点的间隔。
- sampleIndex =-N/2:N/2-1;:生成频率点的索引,从负半轴开始到正半轴结束。
- f=sampleIndex*df;:计算每个频率点对应的频率值。
- figure(2); stem(f,abs(X)); xlabel('f(Hz)'); ylabel('|X(k)|');:绘制频谱图,横轴为频率,纵轴为幅值。
- phase_ =atan2(imag(X),real(X))*180/pi;:计算X中每个频率点的相位,单位为角度。
- figure(3); plot(f,phase_);:绘制相位谱图,横轴为频率,纵轴为相位角度。
- X2=X;:将X复制给X2,用于后面的处理。
- threshold=max(abs(X))/10000;:计算幅值的阈值,将小于该阈值的幅值置零。
- X2(abs(X)<threshold)=0;:将小于阈值的幅值置零。
- phase_ =atan2(imag(X2),real(X2))*180/pi;:重新计算X2中每个频率点的相位,单位为角度。
- figure(4); stem(f,phase_);:绘制处理后的相位谱图,横轴为频率,纵轴为相位角度。
- p = max(phase_);:计算处理后的相位谱中的最大相位角度。
阅读全文