我制作了矩形脉冲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的绝对值会随着绝对频率的增加而增加。
答案 0 :(得分:1)
你在代码中犯了几个错误。
您没有在代码中打印出x的值。 我假设你想分析一个对称的矩形脉冲。 但是,您的样本数是奇数值。 这意味着,您的信号不对称,导致信号很小 与理论教科书价值相比的差异。
矩形脉冲具有无限带宽。 但是,对于FFT,采样率必须至少是最高频率的两倍 信号。这意味着您的采样率必须至少为2 *无穷大。 运气不好,你不能这样做。没人能做到这一点。 因此,您将获得别名,这意味着您的结果包含错误。 好消息是,在矩形函数的情况下,这种效果可以得到补偿 借助 sinc 功能。
如果你做对了,你会得到正确的教科书系数。 如果输入信号的形式如(N = 10)11111-1-1-1-1-1,则函数为a 奇怪的功能。这意味着f(-t)= -f(t)。在这种情况下,矩形可以由a构造 一系列正弦函数。理论功能是:
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的结果
前十个非零频率的相位值:
>> 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