最近做設計,要對采集到的數據進(jìn)行頻譜分析。剛開(kāi)始將所有采樣數據全部送入Matlab進(jìn)行分析,效果總是很不理想。翻閱課本、搜查網(wǎng)頁(yè),總結出使用Matlab對采樣數據進(jìn)行頻譜分析的理論和方法,特整理于此,和大家分享。。。
1、采樣數據導入Matlab
采樣數據的導入至少有三種方法。
第一就是手動(dòng)將數據整理成Matlab支持的格式,這種方法僅適用于數據量比較小的采樣。
第二種方法是使用Matlab的可視化交互操作,具體操作步驟為:File --> Import Data,然后在彈出的對話(huà)框中找到保存采樣數據的文件,根據提示一步一步即可將數據導入。這種方法適合于數據量較大,但又不是太大的數據。據本人經(jīng)驗,當數據大于15萬(wàn)對之后,讀入速度就會(huì )顯著(zhù)變慢,出現假死而失敗。
第三種方法,使用文件讀入命令。數據文件讀入命令有textread、fscanf、load等,如果采樣數據保存在txt文件中,則推薦使用 textread命令。如 [a,b]=textread('data.txt','%f%*f%f'); 這條命令將data.txt中保存的數據三個(gè)三個(gè)分組,將每組的第一個(gè)數據送給列向量a,第三個(gè)數送給列向量b,第二個(gè)數據丟棄。命令類(lèi)似于C語(yǔ)言,詳細可查看其幫助文件。文件讀入命令錄入采樣數據可以處理任意大小的數據量,且錄入速度相當快,一百多萬(wàn)的數據不到20秒即可錄入。強烈推薦!
2、對采樣數據進(jìn)行頻譜分析
頻譜分析自然要使用快速傅里葉變換FFT了,對應的命令即 fft ,簡(jiǎn)單使用方法為:Y=fft(b,N),其中b即是采樣數據,N為fft數據采樣個(gè)數。一般不指定N,即簡(jiǎn)化為Y=fft(b)。Y即為FFT變換后得到的結果,與b的元素數相等,為復數。以頻率為橫坐標,Y數組每個(gè)元素的幅值為縱坐標,畫(huà)圖即得數據b的幅頻特性;以頻率為橫坐標,Y數組每個(gè)元素的角度為縱坐標,畫(huà)圖即得數據b的相頻特性。典型頻譜分析M程序舉例如下:
clc
fs=100;
t=[0:1/fs:100];
N=length(t)-1;%減1使N為偶數
%頻率分辨率F=1/t=fs/N
p=1.3*sin(0.48*2*pi*t)+2.1*sin(0.52*2*pi*t)+1.1*sin(0.53*2*pi*t)...
+0.5*sin(1.8*2*pi*t)+0.9*sin(2.2*2*pi*t);
%上面模擬對信號進(jìn)行采樣,得到采樣數據p,下面對p進(jìn)行頻譜分析
figure(1)
plot(t,p);
grid on
title('信號 p(t)');
xlabel('t')
ylabel('p')
Y=fft(p);
magY=abs(Y(1:1:N/2))*2/N;
f=(0:N/2-1)'*fs/N;
figure(2)
%plot(f,magY);
h=stem(f,magY,'fill','--');
set(h,'MarkerEdgeColor','red','Marker','*')
grid on
title('頻譜圖 (理想值:[0.48Hz,1.3]、[0.52Hz,2.1]、[0.53Hz,1.1]、[1.8Hz,0.5]、[2.2Hz,0.9]) ');
xlabel('f (Hz)')
ylabel('幅值')
對于現實(shí)中的情況,采樣頻率fs一般都是由采樣儀器決定的,即fs為一個(gè)給定的常數;另一方面,為了獲得一定精度的頻譜,對頻率分辨率F有一個(gè)人為的規定,一般要求F<0.01,即采樣時(shí)間ts>100秒;由采樣時(shí)間ts和采樣頻率fs即可決定采樣數據量,即采樣總點(diǎn)數N=fs*ts。這就從理論上對采樣時(shí)間ts和采樣總點(diǎn)數N提出了要求,以保證頻譜分析的精準度。
3、數據長(cháng)度的選擇
頻率分辨率F,顧名思義就是頻譜中能夠區分出的最小頻率刻度。如F=0.01,則頻譜圖中橫坐標頻率的最小刻度為0.01,即0.02Hz和 0.03Hz是沒(méi)有準確數據的,但Matlab在畫(huà)圖時(shí)對其進(jìn)行了插值,故而plot作圖時(shí)看到的頻譜是連續的。但用stem來(lái)作圖就可以看出頻率是離散的,stem對了解F的含義非常有幫助。
由此,我們可以進(jìn)一步思考。如果信號所包含的頻率分量不是F的整數倍,那么這個(gè)頻率分量就不會(huì )得到正確的反映。如信號包含1.13Hz頻率分量,而 F=1/ts=fs/N=0.02,則1.13/0.02=56.5,不等于整數,即在頻譜圖中找不到準確的刻度,而只能在第56和57個(gè)頻率刻度上分開(kāi)顯示其幅值,這自然就不準確了。
因此,請大家在頻譜分析時(shí)一定要使F能夠被頻率精度整除。如要求頻率精確度為0.01,則F最大為0.01,也可取值為0.02、0.05、0.001等數據,使0.01/F=整數。而F僅僅由采樣時(shí)間ts(也稱(chēng)數據長(cháng)度)決定,因此一定要選擇好ts,且要首先確定ts的值。
作為驗證,對上面的程序做一個(gè)修改:將t=[0:1/fs:100];改為t=[0:1/fs:83];即ts由100改為83,則F=1/ts由0.01變?yōu)?.012。二者分別作出頻譜圖對比如下:
上圖1 頻譜圖:ts=100s,F=1/ts=0.01
上圖2 頻譜圖:ts=83s,F=1/ts=0.012
對比上面兩個(gè)圖即可發(fā)現,圖2中由于f/F不是整數,在橫坐標中找不到對應的刻度,從而使得各個(gè)頻率的幅值泄漏到了其他頻率。
總結上面的結論,在保證采樣定理所要求的二倍頻的前提下,并不是采樣頻率fs或采樣點(diǎn)數N越大越好,而是要控制好數據長(cháng)度ts,使頻率分辨率F滿(mǎn)足頻率精度。