如何用matlab正确绘制傅里叶级数的相位谱?

时间:2014-09-30 00:00:24

标签: matlab fft phase

我制作了矩形脉冲x,基本周期为2秒,进行傅立叶变换

t=-2:0.01:2; 
dt=t(2)-t(1); %increment of time
fs=1/dt % sampling rate 
n=length(t) %number of samples
X=fftshift(fft(x,n))/n %fourier transform of x%

f=linspace(-fs/2,fs/2, n) %making frequency axis

X_angle=angle(X); %the phase of X

我期待相位谱交替-pi / 2和pi / 2,

但图表(太糟糕了,因为我的声誉不足而无法发布)

告诉我X_angle随着频率的增加而逐渐增加,范围从-pi到pi

当我使用

绘制幅度谱时,它工作得很好
plot(f,X_mag), X_mag=abs(X)

我想我必须使用angle(X)

进行一些调整

但不是与X的大小无关的角度?

我不知道为什么X_angle的绝对值会随着绝对频率的增加而增加。

1 个答案:

答案 0 :(得分:1)

你在代码中犯了几个错误。

  1. 您没有在代码中打印出x的值。 我假设你想分析一个对称的矩形脉冲。 但是,您的样本数是奇数值。 这意味着,您的信号不对称,导致信号很小 与理论教科书价值相比的差异。

    1. 矩形脉冲具有无限带宽。 但是,对于FFT,采样率必须至少是最高频率的两倍 信号。这意味着您的采样率必须至少为2 *无穷大。 运气不好,你不能这样做。没人能做到这一点。 因此,您将获得别名,这意味着您的结果包含错误。 好消息是,在矩形函数的情况下,这种效果可以得到补偿 借助 sinc 功能。

    2. 如果你做对了,你会得到正确的教科书系数。 如果输入信号的形式如(N = 10)11111-1-1-1-1-1,则函数为a 奇怪的功能。这意味着f(-t)= -f(t)。在这种情况下,矩形可以由a构造 一系列正弦函数。理论功能是:

    3. f(t)= 4 / pi(sin(wt)+ 1/3 sin(3wt)+ 1/5 sin(5wt)+ 1/7 sin(7wt)......)

      没有像sin(2wt)或sin(4wt)这样的偶数的频率。 这意味着,频谱中的每个第二频率都具有零值。 由数值噪声引起的这些值不是精确为零,而是接近于零。 从这些值计算相位会产生无意义的值。 其他频率是正弦函数的傅里叶变换值。 正弦函数的FFT是纯虚数。因为总和的所有元素都有 相同的符号,所有角度都有相同的值,即pi / 2.

      您可以在下面找到修改后的代码:

      close all;
      clear all;
      clc;
      
      t=-2:0.01:(2-0.01); 
      dt=t(2)-t(1); %increment of time
      fs=1/dt; % sampling rate 
      n=length(t); %number of samples
      x = [ones(1,n/2), -ones(1,n/2)];
      X=fft(x)/n; %fourier transform of x%
      
      f=0:n-1; %making frequency axis
      sincComp = @(N) (exp(-i*pi*(f/N)).*sinc(f/N)).';
      %  Perform the compensation
      comp = transpose(sincComp(n));
      Xcorrected = X.*comp;
      
      X_angle=angle(Xcorrected(2:2:n)); %the phase of X
      
      figure;
      subplot(3,1,1);
      hold on;
      stem(f(1:10), pi*abs(X(1:10))/2, 'ob', 'LineWidth', 3);
      plot(f(1:10), pi*abs(Xcorrected(1:10))/2, 'or', 'LineWidth', 3);
      hold off;
      grid on;
      title('Absolute value of FFT result', 'FontSize', 18);
      xlabel('frequency', 'FontSize', 18);
      ylabel('abs', 'FontSize', 18);
      legend(['FFT'], ['FFT compensated']);
      subplot(3,1,2);
      hold on;
      stem(f(1:10), pi*real(X(1:10))/2, 'ob', 'LineWidth', 3);
      plot(f(1:10), pi*real(Xcorrected(1:10))/2, 'or', 'LineWidth', 3);
      hold off;
      grid on;
      title('Real value of FFT result', 'FontSize', 18);
      xlabel('frequency', 'FontSize', 18);
      ylabel('real', 'FontSize', 18);
      subplot(3,1,3);
      hold on;
      stem(f(1:10), pi*imag(X(1:10))/2, 'ob', 'LineWidth', 3);
      plot(f(1:10), pi*imag(Xcorrected(1:10))/2, 'or', 'LineWidth', 3);
      hold off;
      grid on;
      title('Imaginary value of FFT result', 'FontSize', 18);
      xlabel('frequency', 'FontSize', 18);
      ylabel('imag', 'FontSize', 18);
      

      Result of FFT and zinc-compensated FFT

      FFT和锌补偿FFT的结果

      前十个非零频率的相位值:

      >> X_angle(1:10)*2/pi
      ans =
      -1.0000   -1.0000   -1.0000   -1.0000   -1.0000   -1.0000   -1.0000   -1.0000   -1.0000   -1.0000