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 此...