簡體   English   中英

如何使用Matlab正確繪制傅立葉級數的相譜?

[英]How can I correctly plot phase spectrum of fourier series with matlab?

我做了一個基本周期為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的絕對值會隨着絕對頻率的增加而增加。

您在代碼中犯了兩個錯誤。

  1. 您沒有在代碼中打印出x的值。 我假設您要分析對稱的矩形脈沖。 但是,您的樣本數是一個奇數值。 這意味着您的信號不是對稱的,與理論教科書的值相比,會導致很小的差異。

    1. 矩形脈沖具有無限帶寬。 但是,對於FFT,采樣率必須至少是信號最高頻率的兩倍。 這意味着您的采樣率必須至少為2 *無窮大。 倒霉,你不能那樣做。 沒有人能做到。 結果,您將獲得別名,這意味着您的結果包含錯誤。 好消息是,在使用矩形函數的情況下,可以通過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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM