0

我制作了一个基本周期为 2 秒的矩形脉冲 x 到傅立叶变换

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 的绝对值会随着绝对频率的增加而增加。

4

1 回答 1

1

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

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

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

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

    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);

FFT 和锌补偿 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
于 2014-09-30T20:37:32.643 回答