Matlab中fft後的頻譜幅度為什麼要乘以

2021-04-19 22:28:19 字數 7331 閱讀 1947

1樓:匿名使用者

不知你弄懂沒有,這裡我回答一下為

什麼要乘以2吧,至於為什麼要除以n,我比內較贊同上一個回容答中使用者dukinkin從積分角度來進行的理解。

以下是我對為什麼要乘以2的理解,如果不對,請批評指正:

你所見到的乘以2的情景,大概是在matlab中fft函式的示例中,其中用到的訊號是sin,比如我這裡用a1=0.7, f1=50; a2=1, f2=200:x(t)=0.

7sin(100*pi*t) + sin(400 * pi * t)。

不過,其實x(t)還可以表示為:

x(t)的另一種表示方法

這個表示方法看起來比較繞,但是其實它在頻域是比較直觀的,由此可以理解:y=fft(x);  p2 = abs(y/l);【這裡的字母含義跟fft函式的說明檔案中一樣】得到的雙側振幅譜(如下圖,我在運算中用到的基本引數為:取樣頻率1000,取樣點數100)中,那幾個尖脈衝就是0.

35和0.5,即a1/2和a2/2

因此,在表示單側振幅譜時,matlab示例想要弄成尖脈衝直接等於sin訊號的幅值a1、a2的那種直觀的形式,就乘2了

2樓:匿名使用者

其實除bai以n或除以n/2

**於將連du續的運算化為離散的運算

積分的zhi

時候dao一般積分符號後面的表示式版是f(x)dx,就是某個權函式f(x)和自變數微分dx的乘積而寫成離散求和的時候通常只寫f[n]的求和,略去了與dn相乘可以遇見的是,某個函式f(x),如果我們用離散的辦法去求其積分隨著取樣點的則加,離散的和就會增大

實際上正確的辦法是求和時要乘上取樣的間隔,就是積分割槽間/n對於很多離散的積分演算法,例如卷積,最後結果都要除以取樣點數n才能得到正確結果

而傅立葉變化也是一種積分變換,所以得到的結果就要除以n,才是正確的而變換後的頻譜通常將0頻移到中間,分為對稱的為正負頻率(模對稱,幅角反對稱)

有時表示頻譜的時候只需要用其一半正頻率部分就夠了所以除以n之後還要乘以2,表示把正負頻率的加在一起而0頻的直流分量,本身在對稱點,已經是正負相加過的,所以只用除以n

3樓:無畏無懼

其實除以

copyn或除以n/2

**於將連續的運算化為離散的運算

積分的時候一般積分符號後面的表示式是f(x)dx,就是某個函式f(x)和自變數微分dx的乘積而寫成離散求和的時候通常只寫f[n]的求和,略去了與dn相乘可以遇見的是,某個函式f(x),如果我們用離散的辦法去求其積分隨著取樣點的則加,離散的和就會增大

實際上正確的辦法是求和時要乘上取樣的間隔,就是積分割槽間/n對於很多離散的積分演算法,例如卷積,最後結果都要除以取樣點數n才能得到正確結果

而傅立葉變化也是一種積分變換,所以得到的結果就要除以n,才是正確的而變換後的頻譜通常將0頻移到中間,分為對稱的為正負頻率(模對稱,幅角反對稱)

有時表示頻譜的時候只需要用其一半正頻率部分就夠了所以除以n之後還要乘以2,表示把正負頻率的加在一起而0頻的直流分量,本身在對稱點,已經是正負相加過的,所以只用除以n.

4樓:射日金錐

不知道你現在弄明白沒。

matlab裡面的

fft函式,用的是複數形式的fourier公式計算方法,返回的值是版cn。但是注意,這權

個cn跟三角函式形式的fourier公式裡的cn意義不一樣。前者中的cn表示的直接就是振幅,即an與bn的平方和開平方,後者與模(an與bn的平方和開平方)相差2/n倍數。所以你如果用三角形式的fourier公式直接程式設計,返回cn,能直接得到振幅,而用matlab自帶函式fft得到的要*2/n。。。

可能幾句話也講不明白,就這樣給你個思路,如果非要弄明白,你自己可以仔細看看高數裡面兩個cn與an、bn的關係,自己試著推導一下。

如果有什麼看法,可以再交流。

matlab fft變換後 plot(f,2*abs(y)/length(y)) 為何要乘以2除以y的長度才能得到正確的幅值呢?

5樓:創舊黃

因為sin(2*pi*f*t) = (e^(j*2*pi*f*t) - e^(-j*2*pi*f*t)) / 2j.

所以你的a*sin做fft之後得到的幅值應該是在+/-(nfft*f)的地方各有一個幅度為a*nfft/2j的線.

matlab fft變換後幅值不對

6樓:

fft後的頻域幅值不是訊號在時域的幅值,倆相等才是不正常的。

7樓:愚笨的小寶

已經有bai網友解答在用dumatlab過程中使用fft()函式求zhi

解訊號頻譜過程dao中,相應的幅值要做版修正的問題,即參權加fft運算的點數為n時,最後幅值要除以n乘以2(直流分量時除以n即可),那麼關於最後計算的結果為何比我們預期的要小,這個問題有兩個方面原因,第一個原因是離散訊號的點數,一般我們要求是2的冪指數例如l個,若不滿足要求我們會補充零值,可以從能量守恆的角度考慮補充了資訊點數使得訊號長度增加,但因為是零值所以能量不變,但fft()作用後我們頻點數往往也是這個l,而且我們補充的零值是要參與其中計算的,所以這種能量不變卻是頻點數增加的做法,最後的結果比理論值小,這個是主要原因。第二個因素不是回答這個問題的,但往往初次使用matlab的fft()函式會人為的設定參加的運算點數,這個點數設定的過大比如剛好比訊號離散點數大了一倍,那麼最後的頻譜幅值剛好為理論的一半,特別要注意這個問題。

8樓:科技數碼答疑

fft取樣太小,改大些,比如fft256

9樓:匿名使用者

第一個和你的nfft的選取有關,如果nfft>取樣資料n的話,會需要補零點,導致整體的幅值下降回了;第二個就是和

答你設定的取樣頻率有關,理論上取樣頻率設定地越大,fft之後的幅值越接近時域的真實幅值,以上都已試過,歡迎提問!

matlab fft譜分析時得到的頻率是什麼啊?為什麼還要還要畫圖橫座標f=n*fs/n

10樓:瘋狂道人之王

取樣頻率要符合奈奎斯特准則啊,就是fs>=2w,取樣間隔ts自然就等於1/fs啦,訊號處理好好學哦

matlab中進行fft譜分析,如何將頻譜圖的橫座標轉換成頻率?

11樓:楊好巨蟹座

一.呼叫方法

x=fft(x);

x=fft(x,n);

x=ifft(x);

x=ifft(x,n)

用matlab進行譜分析時注意:

(1)函式fft返回值的資料結構具有對稱性。

例:n=8;

n=0:n-1;

xn=[4 3 2 6 7 8 9 0];

xk=fft(xn)

→xk =

39.0000 -10.7782 + 6.

2929i 0 - 5.0000i 4.7782 - 7.

7071i 5.0000 4.7782 + 7.

7071i 0 + 5.0000i -10.7782 - 6.

2929i

xk與xn的維數相同,共有8個元素。xk的第一個數對應於直流分量,即頻率值為0。

(2)做fft分析時,幅值大小與fft選擇的點數有關,但不影響分析結果。在ifft時已經做了處理。要得到真實的振幅值的大小,只要將得到的變換後結果乘以2除以n即可。

二.fft應用舉例

例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。取樣頻率fs=100hz,分別繪製n=128、1024點幅頻圖。

clf;

fs=100;n=128; %取樣頻率和資料點數

n=0:n-1;t=n/fs; %時間序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %訊號

y=fft(x,n); %對訊號進行快速fourier變換

mag=abs(y); %求得fourier變換後的振幅

f=n*fs/n; %頻率序列

subplot(2,2,1),plot(f,mag); %繪出隨頻率變化的振幅

xlabel('頻率/hz');

ylabel('振幅');title('n=128');grid on;

subplot(2,2,2),plot(f(1:n/2),mag(1:n/2)); %繪出nyquist頻率之前隨頻率變化的振幅

xlabel('頻率/hz');

ylabel('振幅');title('n=128');grid on;

%對訊號取樣資料為1024點的處理

fs=100;n=1024;n=0:n-1;t=n/fs;

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %訊號

y=fft(x,n); %對訊號進行快速fourier變換

mag=abs(y); %求取fourier變換的振幅

f=n*fs/n;

subplot(2,2,3),plot(f,mag); %繪出隨頻率變化的振幅

xlabel('頻率/hz');

ylabel('振幅');title('n=1024');grid on;

subplot(2,2,4)

plot(f(1:n/2),mag(1:n/2)); %繪出nyquist頻率之前隨頻率變化的振幅

xlabel('頻率/hz');

ylabel('振幅');title('n=1024');grid on;

執行結果:

fs=100hz,nyquist頻率為fs/2=50hz。整個頻譜圖是以nyquist頻率為對稱軸的。並且可以明顯識別出訊號中含有兩種頻率成分:

15hz和40hz。由此可以知道fft變換資料的對稱性。因此用fft對訊號做譜分析,只需考察0~nyquist頻率範圍內的福頻特性。

若沒有給出取樣頻率和取樣間隔,則分析通常對歸一化頻率0~1進行。另外,振幅的大小與所用取樣點數有關,採用128點和1024點的相同頻率的振幅是有不同的表現值,但在同一幅圖中,40hz與15hz振動幅值之比均為4:1,與真實振幅0.

5:2是一致的。為了與真實振幅對應,需要將變換後結果乘以2除以n。

例2:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t),fs=100hz,繪製:

(1)資料個數n=32,fft所用的取樣點數nfft=32;

(2)n=32,nfft=128;

(3)n=136,nfft=128;

(4)n=136,nfft=512。

clf;fs=100; %取樣頻率

ndata=32; %資料長度

n=32; �t的資料長度

n=0:ndata-1;t=n/fs; %資料對應的時間序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %時間域訊號

y=fft(x,n); %訊號的fourier變換

mag=abs(y); %求取振幅

f=(0:n-1)*fs/n; %真實頻率

subplot(2,2,1),plot(f(1:n/2),mag(1:n/2)*2/n); %繪出nyquist頻率之前的振幅

xlabel('頻率/hz');ylabel('振幅');

title('ndata=32 nfft=32');grid on;

ndata=32; %資料個數

n=128; %t採用的資料長度

n=0:ndata-1;t=n/fs; %時間序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y=fft(x,n);

mag=abs(y);

f=(0:n-1)*fs/n; %真實頻率

subplot(2,2,2),plot(f(1:n/2),mag(1:n/2)*2/n); %繪出nyquist頻率之前的振幅

xlabel('頻率/hz');ylabel('振幅');

title('ndata=32 nfft=128');grid on;

ndata=136; %資料個數

n=128; �t採用的資料個數

n=0:ndata-1;t=n/fs; %時間序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y=fft(x,n);

mag=abs(y);

f=(0:n-1)*fs/n; %真實頻率

subplot(2,2,3),plot(f(1:n/2),mag(1:n/2)*2/n); %繪出nyquist頻率之前的振幅

xlabel('頻率/hz');ylabel('振幅');

title('ndata=136 nfft=128');grid on;

ndata=136; %資料個數

n=512; �t所用的資料個數

n=0:ndata-1;t=n/fs; %時間序列

x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t);

y=fft(x,n);

mag=abs(y);

f=(0:n-1)*fs/n; %真實頻率

subplot(2,2,4),plot(f(1:n/2),mag(1:n/2)*2/n); %繪出nyquist頻率之前的振幅

xlabel('頻率/hz');ylabel('振幅');

title('ndata=136 nfft=512');grid on;

結論:(1)當資料個數和fft採用的資料個數均為32時,頻率解析度較低,但沒有由於添零而導致的其他頻率成分。

(2)由於在時間域內訊號加零,致使振幅譜中出現很多其他成分,這是加零造成的。其振幅由於加了多個零而明顯減小。

(3)fft程式將資料截斷,這時解析度較高。

(4)也是在資料的末尾補零,但由於含有訊號的資料個數足夠多,fft振幅譜也基本不受影響。

對訊號進行頻譜分析時,資料樣本應有足夠的長度,一般fft程式中所用資料點數與原含有訊號資料點數相同,這樣的頻譜圖具有較高的質量,可減小因補零或截斷而產生的影響。

例3:x=cos(2*pi*0.24*n)+cos(2*pi*0.26*n)

(1)資料點過少,幾乎無法看出有關訊號頻譜的詳細資訊;

(2)中間的圖是將x(n)補90個零,幅度頻譜的資料相當密,稱為高密度頻譜圖。但從圖中很難看出訊號的頻譜成分。

(3)訊號的有效資料很長,可以清楚地看出訊號的頻率成分,一個是0.24hz,一個是0.26hz,稱為高解析度頻譜。

可見,取樣資料過少,運用fft變換不能分辨出其中的頻率成分。新增零後可增加頻譜中的資料個數,譜的密度增高了,但仍不能分辨其中的頻率成分,即譜的解析度沒有提高。只有資料點數足夠多時才能分辨其中的頻率成分。

matlab中離散楔的原理,matlab中離散小波的原理

我感覺matlab離散的原理好像和書中的那些原理沒半毛錢關係?笑翻了,哇咔咔,你才發現啊?這是小波參考書的通病,也是容易讓人抓狂的難點,就是小波理論的示意性理解與實際實現演算法總是被混為一談,實際這兩者有時真的沒半毛錢關係都沒有,完全是兩個領域的問題。在matlab中cwt理論的理解是用你上面的第一...

matlab中if語句後的條件判斷可以用或者and的連

還可以用單符號,例如 表示兩個邏輯值,而 表示兩個邏輯矩陣,可以用 any,all 等來判斷邏輯矩陣的一些情況 if x 5 y 5 且 if x 5 y 8 或 matlab 中if語句後的條件判斷可以用 或者and的連線表示式麼?a b或函式and a,b 表示a和b做邏輯與運算,當a b全為非...

Matlab中的迴圈累加,matlab的 for迴圈求和

function newdata sumr data,r r rem size data,1 r 看行數是否為r的整數倍,rem為取餘命令 if r 0 data data zeros r r,size data,2 如果餘數不為0,則給原矩陣補r r行0元素。end m n size data 此...