2013-02-22 288 views
2

我正在嘗試使用MATLAB計算波形的傅立葉係數。所述係數可以使用下面的公式來計算:如何使用MATLAB計算傅立葉係數

enter image description here

enter image description here

T被選擇爲1,其給出的ω= 2PI。

但是我有問題執行積分。函數是三角波(如果我沒有錯誤,可以使用sawtooth(t,0.5)生成)以及方波。

我試着用下面的代碼(對於三角波):

function [ a0,am,bm ] = test(numTerms) 
      b_m = zeros(1,numTerms); 
      w=2*pi; 
      for i = 1:numTerms 
        f1 = @(t) sawtooth(t,0.5).*cos(i*w*t); 
        f2 = @(t) sawtooth(t,0.5).*sin(i*w*t); 
        am(i) = 2*quad(f1,0,1); 
        bm(i) = 2*quad(f2,0,1); 
      end 
    end 

但是它沒有得到接近我所需要的任何地方的值。 b_m係數給出了一個 三角波,並假設m爲奇數時從正項開始,1/m^2和-1/m^2。

我面臨的主要問題是我不太瞭解積分是如何在MATLAB中工作的,我不確定我選擇的方法是否有效。

編輯: 要clairify,這是我期待時寫的係數已被確定的函數形式:

enter image description here

下面是一個嘗試使用FFT:

function [ a0,am,bm ] = test(numTerms) 
      T=2*pi; 
      w=1; 
      t = [0:0.1:2]; 
      f = fft(sawtooth(t,0.5)); 
      am = real(f); 
      bm = imag(f); 
      func = num2str(f(1)); 
      for i = 1:numTerms 
        func = strcat(func,'+',num2str(am(i)),'*cos(',num2str(i*w),'*t)','+',num2str(bm(i)),'*sin(',num2str(i*w),'*t)'); 
      end 
      y = inline(func); 
      plot(t,y(t)); 
    end 
+0

fft() – 0x90 2013-02-22 16:32:19

+0

我有什麼問題我需要一個適合使用正弦和餘弦函數近似函數的係數,我真的不知道如何從fft給出的形式得到答案,所以我認爲這可能是一種更簡單的方法。 – Rick 2013-02-22 16:33:28

+0

FFT在被積函數中使用表達式exp(i x)= cos(x)+ i sin(x),所以爲了得到cos和sin部分,你只需要取實部和虛部。 – roadrunner66 2013-02-22 16:41:23

回答

2

看起來我您的問題是什麼sawtooth返回mathworks documentation說:

鋸齒(T,寬度)生成修改三角波,其中的寬度,0和1之間的標量參數,確定該點在0和2π之間發生最大值。該功能從間隔0上的-1到1增加到2π寬度,然後在間隔2π寬度上從1線性減少到2π。因此,0.5的參數指定標準的三角波,關於時間點π對稱,峯 - 峯值幅度爲1.鋸齒(t,1)等同於鋸齒(t)。

所以我猜這是部分你的問題。

在您回覆後,我再仔細查看一下。在我看來,這是quad函數;不是很準確!我重鑄像這樣的問題:

function [ a0,am,bm ] = sotest(t, numTerms) 
     bm = zeros(1,numTerms); 
     am = zeros(1,numTerms); 
     % 2L = 1 
     L = 0.5; 
     for ii = 1:numTerms 
     am(ii) = (1/L)*quadl(@(x) aCos(x,ii,L),0,2*L); 
     bm(ii) = (1/L)*quadl(@(x) aSin(x,ii,L),0,2*L); 
     end 
     ii = 0; 
     a0 = (1/L)*trapz(t, t.*cos((ii*pi*t)/L)); 
     % now let's test it 
     y = ones(size(t))*(a0/2); 
     for ii=1:numTerms 
     y = y + am(ii)*cos(ii*2*pi*t); 
     y = y + bm(ii)*sin(ii*2*pi*t); 
     end 
     figure; plot(t, y); 
    end 

    function a = aCos(t,n,L) 
     a = t.*cos((n*pi*t)/L); 
    end 

    function b = aSin(t,n,L) 
     b = t.*sin((n*pi*t)/L); 
    end 

然後我把它叫做喜歡:

[ a0,am,bm ] = sotest(t, 100); 

和我:

Fourier Series

甜蜜!

我真正改變是從quadquadl.我想通了這一點,通過使用trapz這偉大的工作,直到我用的是沒有足夠的分辨率時間向量,這使我相信這是一個數字的問題,而不是東西基本的。希望這可以幫助!

0

要解決您的代碼,我會繪製您正在使用和調查的函數,四元函數如何對它們進行採樣。您可能會對它們進行欠採樣,因此請確保您的最小步長小於函數的週期至少小10倍。

我建議使用內置於Matlab的FFT。 FFT不僅是計算譜的最有效的方法(它依賴於陣列的長度n取決於n * log(n),而依賴於n^2的積分),它也會自動給出頻率點這是由你的(等間隔)時間數據支持的。如果你自己計算積分(如果數據點不是等間隔的話可能需要),你可以計算未解析的頻率數據(比間隔時間更接近間隔1 /,即超出'傅里葉極限')。