對於DFT頻譜洩漏問題的研究

2022-09-08 03:09:12 字數 2953 閱讀 3210

問題簡介:

對於頻率為fs的正弦序列,它的頻譜應該只是在fs處有離散譜。但是,在實際利用dft求它的頻譜時,對時域做了截斷,結果使訊號的頻譜不只是在fs處有離散譜,而是在以fs為中心的頻帶範圍內都有譜線出現,它們可以理解為是從fs頻率上「洩漏」出去的,這種現象稱 為頻譜「洩漏」。

不發生洩露的條件:f_c=(mf_s)/n (m為整數,f_c為訊號頻率,f_s為取樣頻率)

現象分析:

以7k取樣為例:

dft本質是以乙個離散的窗函式對訊號進行取樣,也就是在時域相乘的過程。時域相乘又等價於頻域的卷積,並對頻域的幅值產生影響,在這裡只需要討論頻譜形態而不必討論幅值,由於本次取樣週期為500點,我們畫出乙個500點矩形序列的頻譜圖

可以看出每個頻域的每個小峰寬度都為14hz,理論上說他們的間隔應為

fs/n=7000/500=14

與理論相符合

下一步是與訊號的頻譜進行卷積,由於原訊號的理論頻譜為在f_c及〖-f〗_c的衝激訊號,我們只要將目前的頻譜向左向右移動f_c即可,為了方便,只研究右半塊。

時域取樣率為f_s那麼在頻域中就以f_s/n=7000/500=14hz,從零點開始等間隔取樣,而調製過的訊號每個小峰的寬度也為f_s/n=7000/500=14hz,主峰的寬度為小峰寬度的兩倍,也就是28hz,此時在主峰中會以357*14=4998hz及358*14=5012hz進行取樣,並且在小峰中也會在峰體中取樣,從而顯出原訊號不存在的頻率。

小峰寬度與頻域取樣寬度相等這就表明每個頻域取樣點可以正好落在每個小峰的零點上,而落在最高峰的中間,完美顯示出原訊號的頻譜分布,此時取樣訊號頻率應滿足:

f_c=(mf_s)/n (m為整數)

如果取樣頻率不滿足這一公式,那麼頻率域取樣點就會處於各個旁瓣中,從而在頻域中表現出原訊號不存在的頻率,這些旁瓣的幅值與原訊號頻率距離成反比,越靠近訊號頻率造成的諧波振幅越大。

改進措施

增大fft變換的點數n。 通過增大n,一方面提高頻域解析度,更大可能滿足f=m*fs/n, 另一方面,壓縮取樣訊號的瓣寬,降低洩露水平。

下圖為以不同取樣點數得出的頻譜:

可以明顯看出500點取樣比64點取樣效果好很多。

選用合適的窗函式。根據不同的需求來選擇不同特性的窗函式,主瓣寬但旁瓣衰減大的窗或是主瓣窄但旁瓣相對衰減小的窗。

選取7k, 64點取樣的頻域訊號進行測試,選取常用的hanning窗:

可以看出雖然加窗可以很好地抑制旁瓣,但對於主瓣的頻率卻不能很好地優化,我也試了一下其他的加窗函式,都不太理想,對於本題測試的窄帶訊號,主瓣的訊號尤為重要,只能採用增加取樣點的方法來凸顯主瓣訊號。、

總結要注意理論與實際的差異,並善於思考其中的原因

善於運用優質網路資源

附c++取樣程式:

#include

#include

#include

#include

using namespace std;

void main()

ofstream s**efile_a("xn_7.txt");

for (i = 0; is**efile_a << " " << xn[i] << endl;

s**efile_a.close();

for (i = 0; i

ofstream s**efile_a1("xn_10.txt");

for (i = 0; is**efile_a1 << " " << xn[i] << endl;

s**efile_a1.close();

for (i = 0; i

ofstream s**efile_a1("xn_11.txt");

for (i = 0; is**efile_a1 << " " << xn[i] << endl;

s**efile_a1.close();

matlab程式

顯示取樣過訊號的頻譜:

xn_f=fopen('xn_7.txt','r');

[xn,count]=fscanf(xn_f,'%f');

fclose(xn_f);

fs=7000;

x=xn;

x=x.*hamming(64);%加窗

x = x(:,1);

x = x';

n = length(x);%

t = (0:n-1)/fs;%

y = fft(x);

f = fs/n*(0:round(n/2)-1);

stem(f,abs(y(1:round(n/2))));

xlabel('frequency / (s)');ylabel('amplitude');

title('7k²éñùµäæµæ×');

grid;

顯示取樣矩形序列頻譜:

fs=7000;

x=boxcar(500);%生成矩形序列

x = x(:,1);

x = x';

n = length(x);

y = fft(x,1000);

y=circshift(y,143,2);

y=abs(y)/10;

f1 = fs/length(y)*(0:length(y)-1);

plot(f1,y);

xlabel('frequency / (s)');ylabel('amplitude');

title('ðåºåµäæµæ×');

grid;

DSP 計算DFT頻譜的引數選擇

利用dft在計算連續時間訊號時,由於時域的取樣往往會出現一些問題,下面就dft的一些引數做一些 若訊號的最高頻率為f hf h fh 根據奈奎斯特取樣定理,抽樣頻率 取樣率 應滿足 f s 2f hf s 2f h fs 2f h 也就是抽樣間隔t tt應滿足 t 1 fs 12 fh t frac...

對於FFT和DFT的理解

此篇文章是對 ministm32f103實現家庭普通電路中的電流諧波檢測 一文的補充 本文參考 快速傅利葉變換學習及c語言實現 形象的介紹 什麼是傅利葉變換?手把手教你理解 fft fft是最重要,也是最難懂的。簡單說下原理 fft 快速傅利葉變換 是dft 離散傅利葉變換 的改進演算法,其將dft...

FFT變換中的頻譜洩露問題研究

以下內容為個人理解,如有出入,還望一同 核心基本原理 1.卷積定理 時域訊號的乘積,對映為頻域訊號的卷積 頻域訊號的乘積,對映為時域訊號的卷積 2.基本概念 離散傅利葉變換 dft fft 為離散訊號的傅利葉變換 ft 在k 2 n頻率處的取樣 頻譜洩露的最根本原因還在於訊號的非週期截斷,可以從時域...