1. 程式人生 > >正弦函式及其FFT變換(一)

正弦函式及其FFT變換(一)

        在MATLAB中想要畫一個sin函式是很容易的,比如:首先定義t = 0:0.01:10,然後畫出y = sin(2*pi*t)就可以了,最多再加相角啊之類的引數,但如果在C語言中應該如何自己製造一個sin函式呢?

        應該借鑑數字訊號處理裡的抽樣思想:想生成函式x(t) = a*sin(2*pi*f0*t+ψ),就應該考慮到抽樣定理:以等時間間隔進行抽樣,即x[n] = x[n*Ts] 其中Ts = 1/fs(fs是抽樣頻率)。這時候想生成的函式x(t)就變成了x(t) = x(n*Ts) = x(n) = a*sin(2*pi*f0*n/fs+ψ) = a*sin(w*n+ψ),其中w是數字角頻率,這就將模擬時間訊號轉化成了數字訊號。

        舉個例子,比如想生成函式y = sin(20*pi*t),用matlab直接生產的圖形如下所示(取t=0:0.001:1)

        matlab程式為

 t = 0:0.001:1;
 y = sin(20*pi*t);
plot(t,y);

        如果想用C語言來實現怎麼辦呢?從原函式y = sin(20*pi*t)可知f0 = 10,設fs = 40,n = 0:10(這裡的n都是整數)來看看,此時x(n) = sin(2*pi*f0*n/fs),matlab程式為

clear all;
f0=10;
fs=40;
N=10;
n=0:N-1;
y=sin(2*pi*n*f0/fs);

        畫出來的圖形如下圖:

現在函式式為x[n] = sin(n*pi/2),週期是4

        為什麼看著不像以前的正弦函數了?因為這是對原函式抽樣後得到的,而且它的橫座標已經變成了n而不是t。為了讓抽樣後的x[n]看起來更像x[t]那麼方法只有一個,就是增加抽樣率fs。當抽樣率為80時x[n] = sin(n*pi/4),

f0=10;
fs=80;
N=10;
n=0:N-1;
y=sin(2*pi*n*f0/fs);
plot(n,y);

看著更像x(t)了!這是因為抽樣點更密了。

所以產生x(t)=a*sin(2*pi*f0*t+ψ)的正弦波步驟:
對x(t)進行以fs為抽樣頻率的抽樣後得到
x(n)=a*sin(2*pi*f0*n/fs+ψ)=a*sin(w*n+ψ)
畫的時候指明a,f0,fs,ψ就可以對任意sin函式進行畫圖

那麼,如何知道現在畫出來的x(n)就是以前的x(t)呢?以前是T = 0.1S,現在變成了T = 8,在這種情況下如何換算呢?就有FFT了!

更多精彩內容,請關注我的個人微信公眾號“EE漫談”。

一起漫談電子工程師,技術和生活。