天天看點

數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後

  • 數字信号處理系列部落格:
  • 數字信号處理之信号的合成、分解、相關性及傅裡葉系數的計算
  • 數字信号處理之從傅裡葉系數到DFT

文章目錄

  • 一、前言
  • 二、對合成信号進行各次諧波分析
    • (一)合成信号
    • (二)使用複指數代替正弦餘弦
    • (三)用指數信号與合成信号作相關進行各次諧波分析
  • 三、從傅裡葉系數到DFT
    • (一)FT、DTFT、DFT
    • (二)從傅裡葉系數到DFT
  • 最後

一、前言

  • 信号與系統課程學了一遍傅裡葉變換,數字信号處理課程學了一遍離散傅裡葉變換和快速傅裡葉變換,但是現在談到傅裡葉變換也未能夠一語道出他的本質和精髓,我覺得對于這個在數字信号處理領域有着元老地位的傅裡葉變換僅僅是了解是不夠的,因為我發現在進行很多數字信号處理時這個理論往往很有用,能夠突破正常思維另辟獨特的解決方法,本文将以最簡單的思維方式去讨論如何從傅裡葉系數推導到DFT。

二、對合成信号進行各次諧波分析

  • 從上一篇文章我們知道,欲求一個信号中某種頻率的分量,隻要将這個信号與欲求頻率的信号作相關,即相乘求積分就能夠得到這個信号中欲求頻率所占的分量。

(一)合成信号

  • 在上一篇文章中,我們通過正弦波奇次諧波的疊加合成了方波,這一次為了使結果更明顯同時也為了計算友善,我們将諧波增加到15次,看起來感覺更像方波了,同時使用for循環替代了原來的操作,看起來更簡便
M=15;%諧波次數
sine=zeros(M,N);%各次諧波存放的矩陣
square=zeros(1,N);%存放合成方波
figure(1);
for i=1:2:M
    sine(i,:)=sin(2*pi*i*f*t)/i;%生成i次諧波
    square=sine(i,:)+square;%将諧波疊加
    subplot(M,1,i);
    plot(sine(i,:));
    title(sprintf('%d次諧波信号',i));
end
clear i;%清除臨時變量i
figure(2);
plot(square);
title(sprintf('由1至%d次諧波疊加而成的方波',M));
           
數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後
數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後

(二)使用複指數代替正弦餘弦

  • 由歐拉公式
數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後
  • 可以知道,cos(wt)和sin(wt)兩個相關函數可以用指數e的形式來代替,這樣可以簡化運算

(三)用指數信号與合成信号作相關進行各次諧波分析

  • 将合成信号與相關函數相乘
y_dft(1,:)  =  dft_exp(f,0*w,t);
y_dft(2,:)  =  dft_exp(f,1*w,t);
y_dft(3,:)  =  dft_exp(f,2*w,t);
y_dft(4,:)  =  dft_exp(f,3*w,t);
y_dft(5,:)  =  dft_exp(f,4*w,t);
y_dft(6,:)  =  dft_exp(f,5*w,t);
y_dft(7,:)  =  dft_exp(f,6*w,t);
y_dft(8,:)  =  dft_exp(f,7*w,t);
y_dft(9,:)  =  dft_exp(f,8*w,t);
y_dft(10,:) =  dft_exp(f,9*w,t);
y_dft(11,:) =  dft_exp(f,10*w,t);
y_dft(12,:) =  dft_exp(f,11*w,t);
y_dft(13,:) =  dft_exp(f,12*w,t);
y_dft(14,:) =  dft_exp(f,13*w,t);
y_dft(15,:) =  dft_exp(f,14*w,t);
y_dft(16,:) =  dft_exp(f,15*w,t);
           
  • 求和
Y_DFT(1)  = sum_len(y_dft(1,:) ,N)/N;
Y_DFT(2)  = sum_len(y_dft(2,:) ,N)/N;
Y_DFT(3)  = sum_len(y_dft(3,:) ,N)/N;
Y_DFT(4)  = sum_len(y_dft(4,:) ,N)/N;
Y_DFT(5)  = sum_len(y_dft(5,:) ,N)/N;
Y_DFT(6)  = sum_len(y_dft(6,:) ,N)/N;
Y_DFT(7)  = sum_len(y_dft(7,:) ,N)/N;
Y_DFT(8)  = sum_len(y_dft(8,:) ,N)/N;
Y_DFT(9)  = sum_len(y_dft(9,:) ,N)/N;
Y_DFT(10) = sum_len(y_dft(10,:),N)/N;
Y_DFT(11) = sum_len(y_dft(11,:),N)/N;
Y_DFT(12) = sum_len(y_dft(12,:),N)/N;
Y_DFT(13) = sum_len(y_dft(13,:),N)/N;
Y_DFT(14) = sum_len(y_dft(14,:),N)/N;
Y_DFT(15) = sum_len(y_dft(15,:),N)/N;
Y_DFT(16) = sum_len(y_dft(16,:),N)/N;
           
stem(0:15,abs(Y_DFT));
title('DFT幅值譜');
           
數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後
  • 可以看到1、3、5、7、9、11、13、15次諧波的幅值,和疊加前的幅值是一樣的,而0、2、4、6、8、10、12、14次諧波因為合成信号時并沒有輸入,是以其值都為零
  • 接下來看一下相位譜
stem(0:15,angle(Y_DFT)*180/pi);
title('DFT相位譜');
           
數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後
  • 可以看到1、3、5、7、9、11、13、15次諧波的相位都是90度,與輸入信号相位相同,而0、2、4、6、8、10、12、14次諧波因為輸入為零,是以輸出的信号實部和虛部都趨近于零,對它求相位其實是沒有意義的

回到頂部

三、從傅裡葉系數到DFT

(一)FT、DTFT、DFT

  • FT(Fourier transform)是傅裡葉變換,他是将連續的時域信号變換到連續的頻域信号的工具,但是應為時域和頻域都是連續的信号,而數字系統隻能夠處理離散的信号,是以FT無法在數字系統中使用。
  • DTFT(Discrete Time Fourier Transform)離散時間傅裡葉變換,它是将連續的時域信号通過采樣進行離散化後,再變換到頻域的工具,但是頻域信号依然是連續的,數字系統無法處理。
  • DFT(Discrete Fourier Transform)離散傅裡葉變換,它是将将連續的時域信号通過采樣進行離散化後,變換到頻域信号,再将頻域信号通過采樣進行離散化,得到離散的頻域信号,因為其時域信号和頻域信号都是離散的,可以很友善計算機進行計算,是以相對于前兩者它是在數字系統中運用最廣的。

(二)從傅裡葉系數到DFT

  • 仔細觀察DFT的公式,然後回憶前面我們進行的步驟
    • k=1時,将x(n)這個序列與e^(-2πkn/N)相乘,然後求積分
    • k=3時,
    • k=5時,

      數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後
  • 仔細一想,會發現k=1時對應1次諧波,k=3時對應3次諧波,k=5、7、9…
  • 其實我們之前作的就是DFT,隻不過是我們知道了原信号中有哪些頻率分量,是以我們隻要要用什麼頻率去作相關,而對于DFT,我們并不知道原信号中含有那些頻率分量,是以我們需要更多的頻率都拿來做相關,但是這個頻率到底需要多少呢?于是我們規定一個間隔,每個多少進行一次采樣,隻要保證我們這個間隔足夠小,我們就能分别出原信号中的相差足夠小的頻率分量,這個間隔,就叫做頻譜分辨率。
  • 關于頻譜分辨率,你會發祥它不僅與DFT的點數有關,還與采樣率有關,隻要記住

頻 譜 分 辨 率 = 采 樣 率 ÷ 采 樣 點 數 頻譜分辨率=采樣率÷采樣點數 頻譜分辨率=采樣率÷采樣點數

  • 前面我們分析過了,DFT就是對原信号進行信号的相關,也就是對原信号乘以一個欲知頻率的複指數信号然後求和求均值。為了保證足夠的分辨率并且友善進行頻譜分析,我們将采樣點數設定成128,基波頻率設定成1Hz,采樣率設定成128Hz,那麼頻譜分辨率就是128Hz÷128=1Hz。為了得到完整的DFT頻譜,我們用頻率為[0:1:127](最小值是0,最大值是127,步進1,标準的matlab寫法)的複指數信号去與原信号作相關。
y_dft=zeros(N,N);%合成信号與相關信号相乘後存放到這裡
for i=0:N-1
    y_dft(i+1,:)  =  dft_exp(square,i*f,t);
end
           
  • 求和
Y_DFT=zeros(1,N);%DFT頻譜
for i=0:N-1
    Y_DFT(:,i+1)  = sum_len(y_dft(i+1,:) ,N)/N;
end
           
  • 畫出幅度譜
stem(0:N-1,abs(Y_DFT));
set(gca,'XTick',0:10:N-1);
title('DFT幅值譜');
           
數字信号處理②之從傅裡葉系數到DFT一、前言二、對合成信号進行各次諧波分析三、從傅裡葉系數到DFT最後
  • 可以看到各次諧波的分量值,正好是之前輸入的值
  • 關于右邊為什麼會有一個對稱的頻譜,這個其實用最簡單的思維來了解就是這樣的,由于我們設定的采樣率隻有128Hz,根據奈奎斯特采樣定理,我們能夠采樣的最大不失真信号的頻率就是128÷2=64Hz,也就是說從64Hz到127Hz的頻譜是由于采樣時産生的失真引入的,是以實際上這部分頻譜并沒有意義,也就是說我們隻需要關心0到64Hz的頻譜就行了,同時我們的頻譜域就限制在了64Hz

最後

  • 本文僅僅是以最簡單的思維方式來讨論它的本質及實作,但在實際應用過程中還有很多地方需要注意,例如栅欄效應、頻譜洩露、頻域混疊、窗函數等等。
  • 關于FFT(fast Fourier transform),它本質上就是DFT,隻不過它根據DFT運算過程中旋轉因子的奇、偶、虛、實、對稱等特性,簡化了計算量
  • 關于DFT,它的作用就是将時域信号轉換到頻域信号,給人們提供了另一種獨特的方式去觀察信号,與其說它是一種工具,不如說它是人們的第三隻眼睛,讓人們擁有更強大的能力去觀察世界。
  • 最後送上一句,紙上得來終覺淺,絕知此事要躬行。

聲明:本文僅作為個人技術交流,所述如有不當之處,歡迎讀者批評指正!

轉載請注明出處:https://blog.csdn.net/qq_39432978/article/details/89411438

回到頂部

繼續閱讀