第一篇:現(xiàn)代信號處理課設(shè)報告
中南大學(xué) 課程設(shè)計(jì)報告
題 目 現(xiàn)代信號處理課程設(shè)計(jì) 學(xué)生姓名 萬義武 指導(dǎo)教師 周揚(yáng)、支國明 學(xué) 院 信息科學(xué)與工程學(xué)院 學(xué) 號 0909118219 專業(yè)班級 電子信息專業(yè)1102班
一、課程設(shè)計(jì)題目
1、信號發(fā)生器
用戶根據(jù)測試需要,可任選以下兩種方式之一生成測試信號:(1)直接輸入(或從文件讀取)測試序列;(2)輸入由多個不同頻率正弦信號疊加組合而成的模擬信號公式(如式 1-1 所示)、采樣頻率(Hz)、采樣點(diǎn)數(shù),動態(tài)生成該信號的采樣序列,作為測試信號。12 100sin(2)100sin(2)100sin(2)n f t f t f t
(1-1)
2、頻譜分析
使用 FFT 對產(chǎn)生的測試信號進(jìn)行頻譜分析并展示其幅頻特性與相頻特性,指定需要濾除 的頻帶,通過選擇濾波器類型(IIR / FIR),確定對應(yīng)的濾波器(低通、高通)技術(shù)指標(biāo)。
3、濾波器設(shè)計(jì)
根據(jù)以上技術(shù)指標(biāo)(通帶截止頻率、通帶最大衰減、阻帶截止頻率、阻帶最小衰減),設(shè) 計(jì)數(shù)字濾波器,生成相應(yīng)的濾波器系數(shù),并畫出對應(yīng)的濾波器幅頻特性與相頻特性。(1)IIR DF 設(shè)計(jì):可選擇濾波器基型(巴特沃斯或切比雪夫型);
(2)FIR DF 設(shè)計(jì):使用窗口法(可選擇窗口類型,并比較分析基于不同窗口、不同階數(shù) 所設(shè)計(jì)數(shù)字濾波器的特點(diǎn))。
4、數(shù)字濾波
根據(jù)設(shè)計(jì)的濾波器系數(shù),對測試信號進(jìn)行數(shù)字濾波,展示濾波后信號的幅頻特性與相頻特 性,分析是否滿足濾波要求(對同一濾波要求,對比分析各類濾波器的差異)。(1)IIR DF:要求通過差分方程迭代實(shí)現(xiàn)濾波(未知初值置零處理);
(2)FIR DF:要求通過快速卷積實(shí)現(xiàn)濾波(對于長序列,可以選擇使用重疊相加或重疊 保留法進(jìn)行卷積運(yùn)算)。
5、選做內(nèi)容
將一段語音作為測試信號,通過頻譜展示和語音播放,對比分析濾波前后語音信號的變化,進(jìn)一步加深對數(shù)字信號處理的理解。
二、設(shè)計(jì)過程
《1》、第一、二題:(1).信號發(fā)生器。
①直接輸入(或從文件讀?。y試序列;
②輸入由多個不同頻率正弦信號疊加組合而成的模擬信號公式。
③使用FFT對產(chǎn)生的測試信號進(jìn)行頻譜分析并展示其幅頻特性與相頻特性。(2).源代碼
t=(0:0.00001:1);n=0:100;f1=50;y=sin(2*pi*f1*t);f=input('please f=');T=1/f;x=sin(2*pi*f1*n*T);m=fft(x);h=abs(m);figure(1);subplot(321)plot(t,y);subplot(322)stem(n,x,'.');title('xulitu');subplot(323)plot(n,h);title('fupintu');subplot(324)xi=interp1(n,x,t*f1,'linear');plot(t,xi);title('chongjiantu');
(3)結(jié)果
(4)分析:
采樣原理:對模擬信號進(jìn)行采樣可以看作是一個模擬信號通過一個電子開關(guān)S。設(shè)電子開關(guān)每隔周期T合上一次,每次合上的時間為τ,在電子開關(guān)輸出端得到其采樣信號,一般τ很小, τ越小,采樣輸出脈沖的幅度越接近輸入信號在離散時間點(diǎn)上的瞬時值。
《2》、第三、四題
(1)題目(濾波器設(shè)計(jì)與數(shù)字濾波)
濾波器設(shè)計(jì)—根據(jù)輸入的數(shù)字濾波器的技術(shù)指標(biāo),包括通帶截止頻率,通帶最大衰減,阻帶截止頻率,阻帶最小衰減,設(shè)計(jì)濾波器,生成相應(yīng)的濾波器系數(shù),并畫出對應(yīng)的濾波器幅頻、相頻特性。IIR DF設(shè)計(jì):可選擇濾波器基型(巴特沃斯或切比雪夫型);
(2)源代碼
i=input('please input i(choose fuction)=');switch fix(i)
case {1}%低通濾波
wp=input('please input wp=');ws=input('please input ws=');ap=input('please input ap=');as=input('please inout as=');fs=1;T=1/fs;
wp1=(2/T)*tan(wp/2);ws1=(2/T)*tan(ws/2);
[n,wn]=buttord(wp1,ws1,ap,as,'s');[b,a]=butter(n,wn,'s');[bz,az]=bilinear(b,a,fs);w=linspace(0,2*pi,1000);h=freqz(bz,az,w);
subplot(311)
plot(w(1:500)/pi,abs(h(1:500)));grid;
title(['N=',num2str(n)]);text(0.1,0.8,['b=',num2str(bz)]);text(0.1,0.4,['a=',num2str(az)]);xlabel('w/pi');ylabel('幅度(dB)');
subplot(312)plot(w/pi,angle(h));
xlabel('w/pi');ylabel('相位');grid;
subplot(313)y=real(ifft(h));x=0:999;plot(x,y);
title('單位脈沖響應(yīng)');grid;clear;
case{2}%高通濾波
wp=input('please input wp=');ws=input('please input ws=');ap=input('please input ap=');as=input('please inout as=');fs=1;T=1/fs;
wp1=(2/T)*tan(wp/2);ws1=(2/T)*tan(ws/2);
[n,wn]=buttord(wp1,ws1,ap,as,'s');[b,a]=butter(n,wn,'high','s');[bz,az]=bilinear(b,a,fs);w=linspace(0,2*pi,1000);h=freqz(bz,az,w);
subplot(311)
plot(w(1:500)/pi,abs(h(1:500)));grid;
title(['N=',num2str(n)]);text(0.1,0.9,['b=',num2str(bz)]);text(0.1,0.4,['a=',num2str(az)]);xlabel('w/pi');ylabel('幅度(dB)');
subplot(312)plot(w/pi,angle(h));
xlabel('w/pi');ylabel('相位');grid;
subplot(313)y=real(ifft(h));x=0:999;plot(x,y);
title('單位脈沖響應(yīng) ');grid;clear;
case{3}%帶通濾波
wpl=input('please input wpl=');wph=input('please input wph=');wsl=input('please input wsl=');wsh=input('please input wsh=');ap=input('please input ap=');as=input('please inout as=');wp=[wpl,wph];ws=[wsl,wsh];fs=1;T=1/fs;
wp2=(2/T)*tan(wp/2);ws2=(2/T)*tan(ws/2);
[n,wn]=buttord(wp2,ws2,ap,as,'s');[b,a]=butter(n,wn,'s');[bz,az]=bilinear(b,a,fs);w=linspace(0,2*pi,1000);h=freqz(bz,az,w);
subplot(311)
plot(w(1:500)/pi,abs(h(1:500)));grid;
title(['N=',num2str(n)]);text(0.1,1.2,['b=',num2str(bz)]);text(0.1,0.4,['a=',num2str(az)]);xlabel('w/pi');ylabel('幅度(dB)');
subplot(312)plot(w/pi,angle(h));
xlabel('w/pi');ylabel('相位');grid;
subplot(313)y=real(ifft(h));x=0:999;plot(x,y);
title('單位脈沖響應(yīng) ');grid;clear;
end
(3)結(jié)果
低通濾波
高通濾波
帶通濾波(4)分析
用雙線性變換法設(shè)計(jì)無限脈沖響應(yīng)數(shù)字濾波器(IIF DF)時,先把數(shù)字濾波器指標(biāo)轉(zhuǎn)換成模擬濾波器的指標(biāo),然后根據(jù)模擬濾波器的指標(biāo)設(shè)計(jì)模擬濾波器,再經(jīng)過線性變換把模擬濾波器轉(zhuǎn)換成數(shù)字濾波器。該系統(tǒng)要能夠設(shè)計(jì)巴特沃茲型低通、帶通、高通濾波器,并能夠輸入數(shù)字濾波器的性能指標(biāo),顯示出濾波器的階數(shù)和系數(shù)。該系統(tǒng)的關(guān)鍵部分是濾波器的設(shè)計(jì)部分,按照雙線性變換法設(shè)計(jì)濾波器的步驟進(jìn)行設(shè)計(jì)即可。
三、設(shè)計(jì)總結(jié)與心得體會
在課程設(shè)計(jì)的這段時間,我獲益匪淺。不但進(jìn)一步掌握了數(shù)字信號處理的基礎(chǔ)知識及MATLAB的基本操作。雖然在做的過程中遇到了一些問題,但都通過自己的努力解決了它們。這次課程設(shè)計(jì)對我各方面的綜合能力有了很大的提高,對我以后的實(shí)踐都有很大的幫助。
本次課程設(shè)計(jì)不但讓我又學(xué)到了一些知識,而且也提高了我的綜合能力。使我在各個方面都得到了鍛煉,以后有這樣的機(jī)會一定會更加的很好利用,它不僅可以提高學(xué)習(xí)的針對性而且可以很好的鍛煉動手能力以及自己的邏輯設(shè)計(jì)能力和處理問題的能力,希望在以后這方面的能力會很好的加強(qiáng)。
四、課程設(shè)計(jì)指導(dǎo)書
[1] 《數(shù)字信號處理(第二版)》.丁玉美等 西安電子科技大學(xué)出版社 [2] 《數(shù)字信號處理及其MATLAB實(shí)現(xiàn)》,陳懷琛等譯,電子工業(yè)出版社;
[3] 《MATLAB及在電子信息課程中的應(yīng)用》,陳懷琛等,電子工業(yè)出版社
五、鳴謝
此次的課程社真心感謝那些為我們提供良好的上機(jī)環(huán)境已經(jīng)良好的知道的老師們。同時也感謝中南大學(xué)給了我這一次檢驗(yàn)自己的動手能力以及發(fā)現(xiàn)自己錯誤的機(jī)會!
第二篇:現(xiàn)代信號處理(信號分析)
(一).信號分析
1、編制信號生成程序,產(chǎn)生下述各序列,繪出它們的時域波形
1)單位抽樣序列 ?(n)
2)矩形序列 RN(n)
3)三角波序列
?n?1,0?n?3?x3(n)??8?n,4?n?7
?0,其它?
4)反三角波序列
?4?n,0?n?3?x4(n)??n?3,4?n?7
?0,其它?
5)Gaussian序列
??(n?p)
q?,0?n?15x5(n)??e
?0,其它?2
6)正弦序列
x6(n)?sin16?t
取 fs?64Hz,N?16
7)衰減正弦序列
(t)?Aesin(2?ft)u(t)對連續(xù)信號x70進(jìn)行采樣,可得到測試序列
x 7(n)?Ae? anT?f 0 nT)sin(2u。令(n)A=50,采樣周期T=1ms,即fs=1000Hz,f0=62.5,a=100。
2.對上述信號完成下列信號分析
1)對三角波序列x3(n)和反三角波序列x4(n),作N=8點(diǎn)的FFT,觀察比較它們的幅頻特
性,說明它們有什么異同?繪出兩序列及其它們的幅頻特性曲線。?at在x3(n)和x4(n)的尾部補(bǔ)零,作N=16點(diǎn)的FFT,觀察它們的幅頻特性發(fā)生了什么變化?
分析說明原因。
2)、觀察高斯序列x5(n),固定信號x5(n)中的參數(shù)p=8,令q分別等于2,4,8,觀察它們的時域和幅頻特性,了解當(dāng)q取不同值時,對信號序列的時域幅頻特性的影響;固定q=8,令p分別等于8,13,14,觀察參數(shù)p變化對信號序列的時域及幅頻特性的影響,觀察p等于多少時,會發(fā)生明顯的泄漏現(xiàn)象,混疊是否也隨之出現(xiàn)?記錄實(shí)驗(yàn)中觀察到的現(xiàn)象,繪出相應(yīng)的時域序列和幅頻特性曲線。
3)對于正弦序列x4(n),取數(shù)據(jù)長度N分別等于8,16,32,分別作N點(diǎn)FFT,觀察它們的的時域和幅頻特性,說明它們的差別,簡要說明原因。
4)、觀察衰減正弦序列x7(n)的時域和幅頻特性,繪出幅頻特性曲線,改變采樣頻率fs,使
fs=300Hz,觀察此時的頻譜的形狀和譜峰出現(xiàn)位置?說明產(chǎn)生現(xiàn)象的原因。
3.設(shè)有一連續(xù)時間信號s(t),其由20Hz、220Hz和750Hz的正弦信號疊加而成,分析確定采樣頻率及數(shù)據(jù)分析長度,計(jì)算并繪出信號的頻譜,指出各個頻率份量。
你們先自己看一下Matlab的書,對照書上的例題仿真一下,多練習(xí)。
先給出信號分析部分的題目給你們,你們可以先做做,最好使用GUI,將所有的部分集成在一起。濾波器部分的題目開學(xué)后再給你們,如果Matlab熟練了,那部分做起來很快的。
如果題目中的公式看不到的話,可能是公式編輯器的版本問題,我采用的是公式編輯器5.2
追求完美。他還告誡在場的師生:“每個清華人都負(fù)有責(zé)任,建設(shè)這個國家。為學(xué),要扎扎實(shí)實(shí),不可沽名釣譽(yù)。做事,要公正廉潔,不要落身后罵名?!?/p>
第三篇:數(shù)字圖像處理課設(shè)報告
數(shù)字圖像處理課程設(shè)計(jì)報告
細(xì)胞識別
目錄
第一部分
1、實(shí)驗(yàn)課題名稱--------------------3
2、實(shí)驗(yàn)?zāi)康?-------------------------3
第 1 頁
3、實(shí)驗(yàn)內(nèi)容概要--------------------3 第二部分
1、建立工程文件--------------------3
2、圖像信息獲取--------------------4
3、如何建立下拉菜單--------------6
4、標(biāo)記Mark點(diǎn)----------------------6
5、二值化9
6、填洞---9
7、收縮---10
8、獲取中心點(diǎn)------------------------11
9、細(xì)胞計(jì)數(shù)---------------------------13
10、All-steps---------------------------13
11、擴(kuò)展功能-------------------------14 第三部分
12、各步驟結(jié)果和錯誤舉例------16 第四部分
13、心得體會--------------------------22
第一部分
1、實(shí)驗(yàn)課題:細(xì)胞識別
2、實(shí)驗(yàn)?zāi)康模簩ρ杭?xì)胞切片圖片進(jìn)行各種處理,最終得出細(xì)胞的數(shù)目、面積等信息。
3、實(shí)驗(yàn)內(nèi)容概要:基于VC++6.0軟件下的細(xì)胞識別,通過細(xì)胞的標(biāo)記、二
第 2 頁 值化、填洞、收縮、獲取中心點(diǎn)、計(jì)數(shù)等過程完成實(shí)驗(yàn)?zāi)康摹?/p>
第二部分——實(shí)驗(yàn)具體步驟
1、建立工程文件
① 新建MFC工程項(xiàng)目:--MFC AppWizard、工程名
② 拷貝cdib.h,cdib.cpp到工程文件夾,再向工程里添加
③ doc.h添加變量:m_lpDib 和頭文件#include”cdib.h”
④ doc.cpp:變量(m_lpDib)的new、delete
第 3 頁
⑤ doc.cpp: Serialize()
2、圖像信息獲取
① 讀取圖像參數(shù)View.cpp: OnDraw()?m_pDib->Draw()如果圖像不為空的話,那么就執(zhí)行如下主要代碼:
② 點(diǎn)擊鍵,建立類向?qū)?,在messages中添加OnInitialUpdate()函數(shù),添加代碼實(shí)現(xiàn)對自動打開固定圖片。
③ 通過鼠標(biāo)右擊,點(diǎn)擊建立類向?qū)?,在messages中添加OnMouseMove()函數(shù),添加代碼實(shí)現(xiàn)獲取所要信息,即實(shí)現(xiàn)鼠標(biāo)在圖像任一位置移動時可以直觀的讀取相對應(yīng)位置的信息??梢栽谄聊簧巷@示鼠標(biāo)所指點(diǎn)的坐標(biāo)以及RGB、HSI和灰度值,通過HSI的可以選取合適的閾值來找到細(xì)胞以及邊界。
第 4 頁 ④ 為了RGB圖像轉(zhuǎn)化為人眼更容易識別的HSI模型,我們可以通過添加成員函數(shù)RgbtoHsi來實(shí)現(xiàn)這一功能。
HSI模型與RGB模型的轉(zhuǎn)化關(guān)系
(添加函數(shù)時,可以右擊類窗口中的view.h,選中add member function,之后選擇函數(shù)的返回值類型和函數(shù)描述,其它默認(rèn)不變)
確定后在里面添加實(shí)現(xiàn)函數(shù)功能的代碼。
3、添加下拉菜單
在resourceview那欄的找到菜單按鍵設(shè)置
第 5 頁 雙擊,后在里面添加所需按鍵
每個按鍵的ID號為注意在填寫為IDR_加菜單大寫。
之后右擊按鍵,建立類向?qū)砑影存I所需函數(shù)
4、標(biāo)記mark 分為四步
1.找出mark(red)點(diǎn)和maybemark(blue)點(diǎn)
2.將maybemark(blue)點(diǎn)變成mark(black red)點(diǎn)
3.將mark(black red)點(diǎn)變成edge(yellow(fullred&&fullgreen))點(diǎn) 4.edge點(diǎn)濾波
基本思想:Mark點(diǎn)指的是我們要尋找的細(xì)胞內(nèi)的點(diǎn)。我們先獲取每一個像素點(diǎn)的RGB分量,然后我們將其轉(zhuǎn)化成HSI分量,將H分量進(jìn)行歸一化,因?yàn)镾的范圍是0到1,所以我們要進(jìn)行尺度的一致,這樣才具有可計(jì)算性。然后我們通過每個像素點(diǎn)的H分量和S分量的值與細(xì)胞內(nèi)部的H分量和S分量計(jì)算歐幾里得距離,設(shè)定一個Mark門限值(我們這里將MarkDoor設(shè)置為0.09,大家可以行設(shè)置合適的參數(shù)),小于這個門限值我們就當(dāng)做是細(xì)胞的內(nèi)部,然后對細(xì)胞進(jìn)行標(biāo)記(Red)。還需要設(shè)定一個Maybe Mark門限值(我們這里將Maybe MarkDoor設(shè)置為0.15,大家可以行設(shè)置合適的參數(shù)),我們大于Mark門限值小于Maybe Mark門限值時,我們暫時看成是細(xì)胞,我們進(jìn)行Maybe Mark的標(biāo)記(Blue)。否則的話,我們需要考慮,一些不是Mark和Maybe Mark點(diǎn)的*lpSrc==0我們區(qū)別一下賦值為1,*lpSrc==255
第 6 頁 我們區(qū)別一下賦值為254,*(lpSrc+1)==255我們區(qū)別一下賦值為254.這樣的話,我們在后面判斷是否為Mark點(diǎn)的時候,我們只需要判斷*lpSrc是否為0就可以了,判斷Maybe Mark點(diǎn)時只需要判斷*(lpSrc)是否為255就可以了。對于邊緣的判斷只需要判斷*(lpSrc+1)是否為255就可以了。
將細(xì)胞標(biāo)記為Mark用紅色(255,0,0)標(biāo)記出來,將可能是的細(xì)胞標(biāo)記為MayBe Mark用藍(lán)色(0,0,255)標(biāo)記出來。將MayBeMark To Mark的區(qū)域用亮紅(128,0,0)表示,將不可能是細(xì)胞的區(qū)域、細(xì)胞邊界分別用綠色標(biāo)記出來。操作過程:(1)根據(jù)H、S的歐幾里得距離sqrt(s2+h2)來大致的確定哪些是細(xì)胞(Mark)和可能是細(xì)胞(Maybe Mark)的點(diǎn)。
(2)根據(jù)Maybe Mark點(diǎn)周圍的情況,如果它的上下左右四個方向有Mark點(diǎn),則將Maybe Mark點(diǎn)變成Mark點(diǎn)。
(3)用Sobel算子來做邊緣的提取邊界(0,255,255)(255,255,0),使用3*3的模板,使用歐幾里得距離來判斷是否為邊緣。
兩種Sobel算子如下:
第 7 頁
主要代碼如下:
doubletmp1=pixel[0]+2*pixel[1]+pixel[2]-pixel[6]-2*pixel[7]-pixel[8];doubletmp2=pixel[0]+2*pixel[3]+pixel[6]-pixel[2]-2*pixel[5]-pixel[8];double edge=sqrt(tmp1*tmp1+tmp2*tmp2);
if(edge>edgeDoor)*(lpDst+1)=255;//Sobel判斷該點(diǎn)是否edge//edgeDoor=40(4)edge濾波
就是去除全邊緣點(diǎn)(四周都是背景或邊緣)(強(qiáng)度為5)
5、二值化
基本思想:將原有彩色圖像變換為二值圖像,其中細(xì)胞0X80(128)用Gray(灰色)標(biāo)記出來,邊緣0xF0(240)用Bright(亮色)標(biāo)記出來,其他表示為0。主要代碼:
第 8 頁
6、填洞
將細(xì)胞中或者細(xì)胞相鄰的地方的較小的背景填成細(xì)胞的背景,填完的細(xì)胞背景的灰度值是129,因?yàn)槎急辉L問過了,然后將邊緣去掉。
填洞的基本思想:首先將細(xì)胞或邊緣內(nèi)的黑點(diǎn)置為vistied = 0x01,以該黑點(diǎn)為中心,在其上下左右側(cè)進(jìn)行訪問是否有未訪問的黑點(diǎn),若有則將上方黑點(diǎn)壓棧,且上下左右側(cè)的黑點(diǎn)置已訪問。將堆棧頂端的數(shù)據(jù)彈出,作為新的種子進(jìn)行擴(kuò)散,即以該元素為基點(diǎn),判斷其周圍是否存在未訪問黑點(diǎn),若有則繼續(xù)壓棧,重復(fù)操作。直到找到最后一點(diǎn),此點(diǎn)四周均不存在未訪問黑點(diǎn),結(jié)束訪問。若洞像素數(shù)小于100大于50,洞內(nèi)像素數(shù)及其初進(jìn)棧的點(diǎn)(56,(409,222))時,則進(jìn)行填洞。填洞的過程就是將非mark點(diǎn)轉(zhuǎn)化為mark點(diǎn)。
主要標(biāo)記訪問代碼:
填洞函數(shù)主要代碼分析:
填完洞后,進(jìn)行下面操作:
如果圖像中只有已訪問黑點(diǎn)0x01則將其恢復(fù)成0;如果圖像中只有Edge點(diǎn)0xf0則將 Edge置為黑點(diǎn)。這樣圖像中只有黑色的背景以及灰色的細(xì)胞mark(0x80)點(diǎn)。
主要代碼:
第 9 頁
7、收縮
收縮的目的是為了方便計(jì)數(shù)。通過掃描圖像,對圖像進(jìn)行預(yù)先的3次腐蝕,判斷所生成邊界點(diǎn),然后根據(jù)原理判定是否標(biāo)注該點(diǎn),存放所標(biāo)志的中心點(diǎn),便于統(tǒng)計(jì)細(xì)胞個數(shù)及計(jì)算細(xì)胞半徑。
由Mark生成邊界,我們有四鄰域生成邊界和八鄰域生成邊界。判斷該點(diǎn)是否為Mark點(diǎn),如果是Mark點(diǎn)的話,我們判斷i、j是否是我們選取圖片的邊界,如果是的話,我們將該點(diǎn)變成邊緣點(diǎn),否則我們判斷它的上下左右(周圍八個點(diǎn))是否有非Mark點(diǎn),如有有,則將這邊變成邊緣點(diǎn),反之,不變。
8鄰域收縮操作代碼(4鄰域與8鄰域思想相同):
第 10 頁
8、獲取中心點(diǎn)
根據(jù)前面所作工作統(tǒng)計(jì)獲得的中心點(diǎn)個數(shù),去掉一系列不符合要求的點(diǎn)得出最終的細(xì)胞個數(shù)、細(xì)胞的平均半徑和平均面積,用對話框輸出統(tǒng)計(jì)結(jié)果。
操作過程如下:
① 首先我們要去除訪問標(biāo)志,是我們先前一次在判斷是否需要保存點(diǎn)的時候(MarkIt(int i, int j)),我們將邊緣點(diǎn)都標(biāo)記成訪問過了,這時在處理下一次遍歷圖片發(fā)現(xiàn)中心點(diǎn)的時候,我們要進(jìn)行判斷點(diǎn)是否要保存就沒有辦法做了,所以在沒進(jìn)行一次圖片的遍歷之前我們都需要去除訪問標(biāo)志。主要代碼:*lpSrc&=NO_VISITED;//0xfe// 清除visited標(biāo)志
最后位 置0操作
② 需要判斷是否是邊界以外的點(diǎn),這里我們只處理邊界內(nèi)部的點(diǎn),對于邊界外部的點(diǎn)不加以查找中心點(diǎn)。對于內(nèi)部的點(diǎn),我們先要判斷是否是孤立的邊緣點(diǎn),即判斷該邊緣點(diǎn)的上下左右四個點(diǎn)都不是Mark點(diǎn)和邊緣點(diǎn)我們認(rèn)為是孤立的邊緣點(diǎn),但是我們在這里也要去除半徑不大于2的孤立點(diǎn),因?yàn)槲覀冋J(rèn)為它的半徑太小,是噪聲。如果是半徑大于2的孤立點(diǎn),我們對他進(jìn)行標(biāo)記成中心點(diǎn),對半徑做一點(diǎn)補(bǔ)償(pt.radius=k+pre_shrink_count+4,4為補(bǔ)償)。然后在入隊(duì)。
主要代碼如下:
{
第 11 頁 if(k<3)// 如果進(jìn)行第一次收縮即消失的點(diǎn)則認(rèn)為該點(diǎn)是噪點(diǎn),不進(jìn)行保存直接進(jìn)行下一次收縮
continue;
// 孤立的點(diǎn)
*lpSrc |=CENTERED;//0x2 對孤立點(diǎn)加上中心點(diǎn)標(biāo)志0xf2//后面shrink時為0x02
// 保存一下CENTER_POINT信息(圓心,半徑)
pt.x=i;pt.y=j;pt.radius=k + pre_shrink_count + 4;// +4放大補(bǔ)償,k為把此圓收縮到一點(diǎn)所經(jīng)歷的收縮次數(shù)
points_temp.push_back(pt);continue;}
③ 需要判斷是否需要保存該點(diǎn),我們在判斷它的上下左右是否有沒有訪問過的邊緣點(diǎn),這里我們運(yùn)用遞歸函數(shù)來找相連通的邊緣點(diǎn),如果是全邊緣點(diǎn)的時候我們就需要保存,即將m_bFullEdge=1。在保存的函數(shù)中我們將該點(diǎn)變成中心點(diǎn),然后半徑補(bǔ)償然后我們來對該點(diǎn)入隊(duì)(保存),然后將該點(diǎn)設(shè)置成沒有訪問過的點(diǎn),因?yàn)橄旅嬖谧鲈擖c(diǎn)的上下左右是否為訪問過的,訪問過才保存,因?yàn)檫@個點(diǎn)已經(jīng)保存過了,所以要將保存過的點(diǎn)設(shè)置成沒有訪問過,我們必須將這點(diǎn)變成沒有訪問過。然后判斷該點(diǎn)的周圍八點(diǎn)是否是訪問過的,如果訪問過就保存該點(diǎn),這里也是運(yùn)用遞歸函數(shù)來實(shí)現(xiàn)的。
對中心點(diǎn)處理:
a)獨(dú)立的中心點(diǎn)直接存儲
b)相鄰的中心點(diǎn)通過遞歸求質(zhì)心作為圓心,最大半徑作為新的半徑,合并各中心為一點(diǎn)
主要代碼如下:
pt.x=tot_x/tot_num;//質(zhì)心 pt.y=tot_y/tot_num;pt.radius=max_radius;//取最大半徑作為質(zhì)點(diǎn)中心點(diǎn)半徑 *(lpSrc-(pt.y-j)*lLineBytes+pt.x-i)|=CENTERED;//質(zhì)點(diǎn)置為中心點(diǎn) points.push_back(pt);c)相近但不相鄰的點(diǎn),求質(zhì)心為圓心,最大半徑為半徑(直到無相近點(diǎn))
主要代碼如下:
if(abs(x0-x)+abs(y0-y)<10)// 相近
{
/*pt=points.at(j);if(points.at(i).radius
pt=points.at(i);*/ points.at(i).x=(x+x0)/2;//取均值,保存最大半徑
第 12 頁
points.at(i).y=(y+y0)/2;points.at(i).radius=max(points.at(i).radius,points.at(j).radius)+4;pt=pt=points.at(i);d)在無相近點(diǎn)的情況下,若半徑小于8,則刪除。
主要代碼如下:
if(bdelete)
{
} e)兩圓相交,若其中一圓非相交部分面積小于50%,則刪除
主要代碼如下:
if(total
9、細(xì)胞計(jì)數(shù)
打開我們處理前的圖片,根據(jù)前面保存中心點(diǎn)的隊(duì)列,我們知道中心點(diǎn)的位置和細(xì)胞的半徑,然后我們重新的導(dǎo)入細(xì)胞的圖片,在上面畫圓,標(biāo)出細(xì)胞。然后我們獲取細(xì)胞內(nèi)部的HSI的最大值和最小值,計(jì)算出細(xì)胞的平均面積和個數(shù)。主要代碼如下:
msg.Format(“共有%d個細(xì)胞,平均半徑%d,平均面積%d : H(%3.1f,%3.1f)S(%3.2f,%3.2f)I(%3.2f,%3.2f)”, m_vCenterPoints.size(),(int)(totr/m_vCenterPoints.size()+.5),(int)(tota/m_vCenterPoints.size()+.5), 360.0*min[0]/255.0,360.0*max[0]/255.0, 1.0*min[1]/255.0,1.0*max[1]/255.0, 1.0*min[2]/255.0,1.0*max[2]/255.0);
10、All-steps
第 13 頁 可以一次性實(shí)現(xiàn)細(xì)胞識別的所有操作步驟
設(shè)置控制按鍵的權(quán)限,點(diǎn)擊update_command_ui ,鍵入控制條件
每步操作時給cellprocess設(shè)置不同數(shù)值,表示那步進(jìn)行過,只能進(jìn)行規(guī)定的下步操作,從而在運(yùn)行過程中放置按鍵誤觸導(dǎo)致程序崩潰。
11、擴(kuò)展:
區(qū)域選擇:
第 14 頁
建立類向?qū)В篛nButtonDown 和OnButtonUp 鍵入代碼:
在OnDraw中添加下列代碼
注意:bool 變量m_bDrag要定義在view.cpp文件頭部,定義在view.h會出現(xiàn)第一次區(qū)域選擇時出現(xiàn)錯誤。
添加復(fù)位按鍵:
第 15 頁
點(diǎn)擊該鍵后會重新讀取圖像(和圖像自動打開代碼一樣)
第三部分
12、各步驟結(jié)果和錯誤舉例
① 各步驟結(jié)果圖
a.Mark(Red)& MayBe Mark(Blue)
maybemark to mark(black red)第 16 頁
edge information and edge filter
twovalue
fillholes 第 17 頁
shrink
findcenter 第 18 頁
count
出現(xiàn)的錯誤舉例:
Mousemove 程序中出現(xiàn)問題: 1.錯誤:
沒有加#include “MainFrm.h”頭文件 2.錯誤
第 19 頁
error C2248: 'm_wndStatusBar' : cannot access protected member declared in class 'CMainFrame'
需將protected: // control bar embedded members CStatusBar m_wndStatusBar;CToolBar
m_wndToolBar;
protected變?yōu)閜ublic 供用戶操作使用
MouseMove函數(shù)中((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText(0,str);使str.Format中內(nèi)容顯示在標(biāo)準(zhǔn)窗口圖像的左下方bar
3.MouseMove的坐標(biāo)判決放在for循環(huán)外,鼠標(biāo)移動到圖像外,程序會崩潰。解決:改變坐標(biāo)判決代碼的位置
通見問題:
在ClassView中的類視圖不見了,在FileView視圖中該類的.h和.cpp文件仍然存在
解決方案:先保存workspace,然后關(guān)閉工程,刪除此工程目錄中的.ncb文件,重新打開workspace 原因:classview顯示混亂 在類中添加的成員變量和成員函數(shù)不能顯示出來,即使顯示出來了變量或函數(shù),雙擊后不能跳至正確的位置。
第 20 頁
Edge information中出現(xiàn)問題
正常
不正常
memcpy(lpNewDIBBits,lpSrc,lHeight *lLineBytes);代碼應(yīng)放在圖像處理前,參考圖像是初始狀態(tài)的圖像,把第一步的四個小步驟分開寫在不同的函數(shù)內(nèi)時,因?yàn)槊恳恍〔降牟僮鞫紩淖儓D像的狀態(tài),如果把: memcpy(lpNewDIBBits,lpSrc,lHeight *lLineBytes);寫在maybemark_to_mark之后那么參考圖像就不是原始圖像
發(fā)現(xiàn):做到shrink時,看到收縮后的圖像效果很差,和標(biāo)準(zhǔn)收縮圖像相差較大,經(jīng)調(diào)試后發(fā)現(xiàn)問題(沒注意 ppt最后一頁有,老師在qq群在中也提到過)。
Shrink操作后,關(guān)閉圖像,出現(xiàn)問題 GenEdge4()函數(shù)中出現(xiàn)問題 for(int j=0;j { lpSrc =(unsigned char *)pDoc->m_lpDib->m_lpImage + lLineBytes*(lHeight-1-j)-1; for(int i=0;i { lpSrc++;......和 for(int j=0;j for(int i=0;i { 第 21 頁 lpSrc =(unsigned char *)pDoc->m_lpDib->m_lpImage + lLineBytes*(lHeight-1-j)-i;....for循環(huán)問題 有差異 后面起始點(diǎn)地址為dot1 前面起始點(diǎn)地址為 dot1+1,不處理四周邊界 可以把第二個for循環(huán)語句中前面的i=0 改成i=1.觀察圖像,發(fā)現(xiàn)Shirnk后未保存填洞點(diǎn),結(jié)果只有 0x00 0x80 0xf0 // *lpSrc &=NO_EDGE_POINT;//至關(guān)重要 少寫后,程序一直崩潰。 這段代碼在GenEdge函數(shù)中,在shrink步驟中沒影響,但在找中心點(diǎn)過程中用到這個函數(shù)時,這段代碼就十分必要。否則程序會在運(yùn)行findcenter時直接崩潰。 中心點(diǎn)標(biāo)志 0x02 不是0xf2 Temp.at(n).y 等同于 temp[n].y 13、心得體會 通過對本次數(shù)字圖像處理課程設(shè)計(jì)的學(xué)習(xí),進(jìn)一步加深了對數(shù)圖知識的理解,同時也基本掌握了VC++軟件的使用方法。從一開始的連圖像都無法打開,到最后在老師上課的資料以及同學(xué)的幫助和學(xué)長的參考程序下終于完成了一幅細(xì)胞圖像的整個識別過程。自己一向在編程方面有所欠缺,通過咨詢老師和同學(xué)還有百度,自己也慢慢理解了所寫程序代碼的含義,間接地提高了自己寫代碼與識別代碼的能力。 通過一個星期多的學(xué)習(xí),我對細(xì)胞識別的基本思想有了深一步的理解,也讓我對c語言相關(guān)的知識得到了回顧。此次課程設(shè)計(jì)給我們提供了一個既能學(xué)習(xí)又能鍛煉的機(jī)會,使我們養(yǎng)成了查找資料(主要是在百度上查閱一些代碼的含義)的習(xí)慣,將理論與實(shí)際相結(jié)合起來,鍛煉了分析問題和實(shí)際解決問題的能力。提高了適應(yīng)能力,為今后的學(xué)習(xí)和實(shí)踐打下了基礎(chǔ)。 第 22 頁 目錄 一、課程設(shè)計(jì)目的要求 ………………………………………… 1 二、課程設(shè)計(jì)選題 ……………………………………………… 1 三、程序分析及運(yùn)行果 ………………………………………… 1、第一題 …………………………………………………… 2、第三題 …………………………………………………… 3、第五題 …………………………………………………… 4、第七題 …………………………………………………… 四、課程設(shè)計(jì)總結(jié) ……………………………………………… 參考文獻(xiàn) ………………………………………………………… 附.程序源代碼 …………………………………………………… 2 4 6 9 12 13 14 一、課程設(shè)計(jì)目的要求 1.全面復(fù)習(xí)課程所學(xué)理論知識,鞏固所學(xué)知識重點(diǎn)和難點(diǎn),將理論與實(shí)踐很好地結(jié)合起來。 2.提高綜合運(yùn)用所學(xué)知識獨(dú)立分析和解決問題的能力; 3.熟練使用一種高級語言進(jìn)行編程實(shí)現(xiàn)。 二、課程設(shè)計(jì)選題 本次課程設(shè)計(jì),按任務(wù)書要求選擇了1、3、5、7題,第8題為選作,因?yàn)槟芰τ邢?,所以并未選擇,現(xiàn)將題目及要求摘錄如下: 1.給定模擬信號:xa(t)?Ae?atsin(?0t)u(t),式中A?444.128,??502?,?0?502? rad/s。對xa(t)進(jìn)行采樣,可得采樣序列 x(n)?xa(nT)?Ae?anTsin(?0nT)u(nT)1)選擇采樣頻率fs=1 kHz,觀測時間Tp?50ms,觀測所得序列x(n)及其幅頻特性|X(ejw)| 2)改變采樣頻率fs=300Hz,觀測此時|X(ejw)|的變化 3)令采樣頻率fs=200Hz,觀測此時|X(ejw)|的變化 要求分析說明原理,繪出相應(yīng)的序列及其它們對應(yīng)的幅頻特性曲線,指出|X(ejw)|的變化,說明為什么? 3.一個連續(xù)信號含兩個頻率分量,經(jīng)采樣得 x(n)=sin2π*0.125n+cos2π*(0.125+Δf)n n=0,1……,N-1 已知N=16,Δf分別為1/16和1/64,觀察其幅頻特性;當(dāng)N=128時,Δf不變,其結(jié)果有何不同,為什么?分析說明原因,并打印出相應(yīng)的幅頻特性曲線 11?9?n)?cos(n),使用FFT分析其頻譜: 5.一個序列為x(n)?0.5cos(20201)使用不同寬度的矩形窗截短該序列為M點(diǎn)長度,取M分別為: a)M=20 b)M=40 c)M=160 ;觀察不同長度的窗對譜分析結(jié)果的影響; 2)使用漢寧窗、哈明窗重做1) 3)對三種窗的結(jié)果進(jìn)行理論分析及比較。并繪出相應(yīng)的幅頻特性曲線 7.FIR DF的設(shè)計(jì) 分別利用矩形窗、漢寧窗、哈明窗設(shè)計(jì)一個N=11的線性相位FIR 低通和高通數(shù)字濾波器,截止頻率?c??3rad,要求:求出各濾波器的單位脈沖響應(yīng)h(n);繪出各濾波器的幅頻及相頻響應(yīng)曲線;觀察各濾波器的通帶波紋和阻帶波紋;比較不同窗函數(shù)對濾波特性的影響。 三、程序分析及運(yùn)行結(jié)果 程序綜述及GUI界面:程序全部利用matlab語言寫成,通過與GUI模塊的按鈕控件pushbutton鏈接,使之能夠通過按動按鈕跳出顯示窗口來實(shí)現(xiàn)程序的運(yùn)行以及最后結(jié)果的呈現(xiàn),簡潔明了。程序最終的GUI界面如下圖所示: 1、第一題: 設(shè)計(jì)思想:此程序按第一題題目要求,預(yù)先給定了模擬信號?at(t)?Aesin(?0t)u(t),同時給出了相關(guān)參數(shù),A?444.128,??502?,xa?0?502?按照題目要求直接在程序中定義相關(guān)變量并賦值。題目還rad/s。要求采取三種不同的采樣頻率分別為1kHZ、300HZ和200HZ,所以T1=0.001,T2=1/300,T3=0.005。Fft函數(shù)對序列進(jìn)行傅立葉變換,得到幅頻特性曲線。程序通過subplot、stem、plot等函數(shù)將結(jié)果顯示在彈出的窗口中。這樣第一題的要求就基本實(shí)現(xiàn)了。程序代碼: A=444.128;%設(shè)定參數(shù) w=50*sqrt(2)*pi;a=50*sqrt(2)*pi;T1=0.001;N1=50;n=0:49;x1=A*exp(-a*n*T1).*sin(w*n*T1);%所給信號 figure;subplot(3,2,1);stem(x1,'.');%坐標(biāo)函數(shù)及現(xiàn)實(shí)函數(shù) xlabel('n');ylabel('x(n)');title('x(n)序列1');y1=fft(x1,N1);%傅立葉變換 subplot(3,2,2);plot(abs(y1));xlabel('(N=50 wk=2pik/N)k');ylabel('|X1(jw)|');title('幅頻特性|X1(jw)|'); T2=1/300;N2=15;n=0:14 x2=A*exp(-a*n*T2).*sin(w*n*T2);subplot(3,2,3);stem(x2,'.');xlabel('n');ylabel('x(n)');title('x(n)序列2');y2=fft(x2,N2);subplot(3,2,4);plot(abs(y2));xlabel('(N=15 wk=2pik/N)k');ylabel('|X2(jw)|');title('幅頻特性|X2(jw)|');T3=0.005;N3=10;n=0:9;x3=A*exp(-a*n*T3).*sin(w*n*T3);subplot(3,2,5);stem(x3,'.');xlabel('n');ylabel('x(n)');title('x(n)序列3');y3=fft(x3,N3);subplot(3,2,6);plot(abs(y3));xlabel('(N=10 wk=2pik/N)k');ylabel('|X3(jw)|');title('幅頻特性|X3(jw)|'); 運(yùn)行結(jié)果: 結(jié)果分析:從運(yùn)行結(jié)果看,隨著采樣頻率的減少,幅頻特性的失真越明顯。所以采樣頻率越低,越容易失真。 2、第三題: 設(shè)計(jì)思想:用FFT進(jìn)行譜分析時,首先必須對信號進(jìn)行采樣,使之變成離散信號,然后就可按照前面的方法用FFT來對連續(xù)信號進(jìn)行譜分析。按采樣定理,采樣頻率fs應(yīng)大于2倍信號的最高頻率,為了滿足采樣定理,一般在采樣之前要設(shè)置一個抗混疊低通濾波器。 按題目要求,講程序分為N=16和N=128兩部分。首先定義出N、f1、f2等參數(shù),接著列出題目所要求的信號,然后利用傅立葉變換函數(shù),最后通過坐標(biāo)以及輸出函數(shù)得出相應(yīng)幅頻特性曲線。程序代碼: %第三題(N=16)N=16;n=0:15;f1=1/16;f2=1/64; x1=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f1)*n);y1=fft(x1,16);%傅立葉變換函數(shù) figure; subplot(2,2,1);stem(n,abs(y1),'.'); axis([0 15 0 8]);%標(biāo)注坐標(biāo)長度 xlabel('(N=16 wk=2pik/N)k');ylabel('|X1(K)|'); title('幅頻特性|X1(K)|'); x2=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f2)*n);y2=fft(x2,16); subplot(2,2,2);stem(n,abs(y2),'.');axis([0 15 0 8]); xlabel('(N=16 wk=2pik/N)k');ylabel('|X2(K)|');title('幅頻特性|X2(K)|');%第三題(N=128)N=128;n=0:127;f1=1/16;f2=1/64; x1=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f1)*n);y3=fft(x1,128);figure; subplot(2,2,1);stem(n,abs(y3),'.');axis([0 127 0 65]); xlabel('(N=128 wk=2pik/N)k');ylabel('|X3(K)|');title('幅頻特性|X3(K)|'); x2=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f2)*n);y4=fft(x2,128); subplot(2,2,2);stem(n,abs(y4),'.');axis([0 127 0 65]); xlabel('(N=128 wk=2pik/N)k');ylabel('|X4(K)|');title('幅頻特性|X4(K)|'); 運(yùn)行結(jié)果: N=16: N=128: 結(jié)果分析:由實(shí)驗(yàn)運(yùn)行結(jié)果可得出當(dāng)采樣點(diǎn)數(shù)N不同時,信號的幅頻特性是不同的,這是因?yàn)閄(k)是x(n)的傅里葉變換X(ejw)在頻率區(qū)間[0,2π]上的N點(diǎn)等間隔采樣,這就是DFT的物理意義,由此可見,DFT的變換長度N不同,表示對X(ejw)在[0,2π]區(qū)間上的采樣間隔和采樣點(diǎn)數(shù)不同,所以DFT的變換結(jié)果不同。 3、第五題: 設(shè)計(jì)思想:本題給定了一個序列,要求用窗函數(shù)截短。通過調(diào)整窗口長度可以有效的控制過渡段的寬度。其中題目中要求的漢寧窗是升余弦窗,能夠使能量更集中在主瓣中;哈明窗是改進(jìn)的升余弦窗,能使能量更加集中在主瓣中。本程序定義了窗長度,給出相應(yīng)的序列之后,用窗函數(shù)去截短相應(yīng)的長度,最后通過窗口輸出截短后的序列。程序代碼: %第五題(矩形窗) M1=20;M2=40;M3=160;%定義窗長度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);%相應(yīng)序列 x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);b1=boxcar(M1)'.*x1;%用窗函數(shù)截短 b2=boxcar(M2)'.*x2;b3=boxcar(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(b1)),'.');subplot(3,1,2);stem(abs(fft(b2)),'.');subplot(3,1,3);stem(abs(fft(b3)),'.');%第五題(漢寧窗) M1=20;M2=40;M3=160;%定義窗長度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20); x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);y1=hanning(M1)'.*x1;%窗函數(shù)截短 y2=hanning(M2)'.*x2;y3=hanning(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(y1)),'.');subplot(3,1,2);stem(abs(fft(y2)),'.');subplot(3,1,3);stem(abs(fft(y3)),'.');%第五題(哈明窗) M1=20;M2=40;M3=160;%定義窗長度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);h1=hamming(M1)'.*x1;%窗函數(shù)截短 h2=hamming(M2)'.*x2;h3=hamming(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(h1)),'.');subplot(3,1,2);stem(abs(fft(h2)),'.');subplot(3,1,3);stem(abs(fft(h3)),'.'); 運(yùn)行結(jié)果: 矩形窗: 漢寧窗: 哈明窗: 結(jié)果分析:信號的截短產(chǎn)生了能量泄漏,不同的窗函數(shù),產(chǎn)生泄漏的大小不一樣,頻率分辨能力也不一樣,用FFT算法計(jì)算頻譜又產(chǎn)生了柵欄效應(yīng),所以不同的窗函數(shù)對信號頻譜的影響是不一樣的。從運(yùn)行結(jié)果中可以看出矩形窗主瓣比較集中,旁瓣較高,并有負(fù)旁瓣;漢寧窗和哈明窗結(jié)果從圖上粗看基本一樣,但哈明窗加權(quán)的系數(shù)能使旁瓣達(dá)到更小。 4、第七題: 設(shè)計(jì)思想: 題目要求分別利用矩形窗、漢寧窗、哈明窗設(shè)計(jì)一個N=11的線性相位FIR 低通和高通數(shù)字濾波器。FIR濾波器在保證幅度特性滿足技術(shù)要求的同時,很容易做到有嚴(yán)格的線性相位特性。FIR濾波器設(shè)計(jì)的任務(wù)是選擇有限長度的h(n),使傳輸函數(shù)H(ejw)滿足技術(shù)要求。本題中要求設(shè)計(jì)的線性相位FIR濾波器的,可利y用fir1函數(shù)設(shè)計(jì)出濾波器,再利用freqz函數(shù)得出其頻率響應(yīng)。程序代碼: %第七題(矩形窗)N=10;wn=1/3;b1lp=fir1(N,wn,boxcar(N+1));%用fir1函數(shù)設(shè)計(jì)低通濾波器 b1hp=fir1(N,wn,'high',boxcar(N+1));%用fir1函數(shù)設(shè)計(jì)高通濾波器 M=1024;w=0:(M-1);t=0:10; h1lp=freqz(b1lp,1,w/M*2*pi);%得出頻率響應(yīng) h1hp=freqz(b1hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b1lp,'.');subplot(3,2,2);stem(t,b1hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h1lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h1hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h1lp));subplot(3,2,6); plot(w/M*2,angle(h1hp));%第七題(漢寧窗)N=10;wn=1/3; b2lp=fir1(N,wn,hanning(N+1)); b2hp=fir1(N,wn,'high',hanning(N+1));M=1024; w=0:(M-1);t=0:10; h2lp=freqz(b2lp,1,w/M*2*pi);h2hp=freqz(b2hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b2lp,'.');subplot(3,2,2);stem(t,b2hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h2lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h2hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h2lp));subplot(3,2,6); plot(w/M*2,angle(h2hp)); %第七題(哈明窗)N=10;wn=1/3; b3lp=fir1(N,wn,hamming(N+1)); b3hp=fir1(N,wn,'high',hamming(N+1));M=1024;w=0:(M-1);t=0:10; h3lp=freqz(b3lp,1,w/M*2*pi);h3hp=freqz(b3hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b3lp,'.');subplot(3,2,2);stem(t,b3hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h3lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h3hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h3lp));subplot(3,2,6); plot(w/M*2,angle(h3hp)); 運(yùn)行結(jié)果: 矩形窗: 漢寧窗: 哈明窗: 結(jié)果分析:如運(yùn)行結(jié)果所示,通過三個窗口設(shè)計(jì)出的濾波器,得到的頻率響應(yīng)特性是不同的。此題再次驗(yàn)證了第五題的結(jié)論:矩形窗主瓣比較集中,旁瓣較高,并有負(fù)旁瓣;漢寧窗和哈明窗都有使能量集中在主瓣中的作用,但哈明窗加權(quán)的系數(shù)能使旁瓣達(dá)到更小。 四、課程設(shè)計(jì)總結(jié): 隨著課程設(shè)計(jì)報告的基本完成,本次課程設(shè)計(jì)終于接近了尾聲。本次課程設(shè)計(jì)要求我們利用上學(xué)期所學(xué)的現(xiàn)代信號處理課程的知識結(jié)合MATLAB編程工具,完成幾道信號處理以及濾波器設(shè)計(jì)的題目,通過實(shí)際操作,回顧所學(xué)內(nèi)容,夯實(shí)基礎(chǔ),強(qiáng)化理論知識,并體驗(yàn)理論與實(shí)際相結(jié)合的過程。 設(shè)計(jì)過程中遇到的第一個問題便是對于MATLAB語言的不熟悉,其實(shí)現(xiàn)在想想這個本不應(yīng)該成為問題。雖然本專業(yè)并沒有開設(shè)MATLAB程序設(shè)計(jì)這門課,但是在上學(xué)期上現(xiàn)代信號處理課時老師已經(jīng)向我們強(qiáng)調(diào)過MATLAB語言的重要性,并且也在課堂上通過PPT的形式向我們展示了其部分功能。同時,老師還在上學(xué)期結(jié)課時特別提醒過課程設(shè)計(jì)會用到MATLAB語言,要求我們在暑假里去熟悉它??上У氖?,老師的的話并沒有引起我的足夠重視,才導(dǎo)致等到要真正設(shè)計(jì)的時候一頭霧水,無從下手。通過這件事,我明白了對于一件事情,想要做得很好,提前做功課和準(zhǔn)備是必不可少的,機(jī)會只垂青有準(zhǔn)備的人。 當(dāng)然,通過本次課程設(shè)計(jì),我還是基本熟悉了一些MATLAB模塊以及與本課程有關(guān)的一些函數(shù)的用法。但是由于上學(xué)期先代信號處理課程學(xué)得不是很好,所以也就是在懂的同學(xué)的指導(dǎo)下按部就班的寫了一些代碼,也沒有什么創(chuàng)新,但還是很好的回顧的所學(xué)的頻譜分析以、傅立葉變換以及濾波器設(shè)計(jì)的內(nèi)容。也實(shí)際設(shè)計(jì)了一個濾波器,雖然借助與MATLAB函數(shù),但也算一個不錯的結(jié)果。老師在任務(wù)書中提到的目的要求,我自認(rèn)為多多少少完成到達(dá)了一些。但不可否認(rèn)的是還有很多沒有達(dá)到??傊?,很多東西還是需要自己在不斷的摸索中找到答案。 另外,通過這次課程設(shè)計(jì)讓我認(rèn)識了一門新的語言———MATLAB,它在以后的學(xué)習(xí)中還會用到,相信在以后學(xué)習(xí)的過程的中,我會比較好的掌握并運(yùn)用它。 參考文獻(xiàn) 1、《數(shù)字信號處理》第二版,丁玉美 高西全等,西安電子科技大學(xué)出版社,2001.1 2、《MATLAB及在電子信息課程中的應(yīng)用》,陳懷琛等,電子工業(yè)出版社出版,2002.4 3、《MATLAB數(shù)字信號處理與應(yīng)用》,張德豐等,清華大學(xué)出版社,2010 4、《MATLAB數(shù)字信號處理》,王彬等,機(jī)械工業(yè)出版社,2010 5、《信號與信息處理基礎(chǔ)》,彭軍 李宏等,中國鐵道出版社,2009.2 附.程序源代碼 function varargout = untitled(varargin)%UNTITLED M-file for untitled.fig % UNTITLED, by itself, creates a new UNTITLED or raises the existing % singleton*.% % H = UNTITLED returns the handle to a new UNTITLED or the handle to % the existing singleton*.% % UNTITLED('Property','Value',...)creates a new UNTITLED using the % given property value pairs.Unrecognized properties are passed via % varargin to untitled_OpeningFcn.This calling syntax produces a % warning when there is an existing singleton*.% % UNTITLED('CALLBACK')and UNTITLED('CALLBACK',hObject,...)call the % local function named CALLBACK in UNTITLED.M with the given input % arguments.% % *See GUI Options on GUIDE's Tools menu.Choose “GUI allows only one % instance to run(singleton)”.% % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help untitled % Last Modified by GUIDE v2.5 21-Oct-2011 14:29:04 % Begin initialization codeDO NOT EDIT %---Executes just before untitled is made visible.function untitled_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) % Get default command line output from handles structure varargout{1} = handles.output; %---Executes on button press in pushbutton1.function pushbutton1_Callback(hObject, eventdata, handles)% hObject handle to pushbutton1(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第三題(N=16)N=16;n=0:15;f1=1/16;f2=1/64; x1=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f1)*n);y1=fft(x1,16);%傅立葉變換函數(shù) figure; subplot(2,2,1);stem(n,abs(y1),'.');axis([0 15 0 8]);%標(biāo)注坐標(biāo)長度 xlabel('(N=16 wk=2pik/N)k');ylabel('|X1(K)|');title('幅頻特性|X1(K)|'); x2=sin(2*pi*0.125*n)+cos(2*pi*(0.125+f2)*n);y2=fft(x2,16); subplot(2,2,2);stem(n,abs(y2),'.');axis([0 15 0 8]); xlabel('(N=16 wk=2pik/N)k');ylabel('|X2(K)|');title('幅頻特性|X2(K)|'); %---Executes on button press in pushbutton11.function pushbutton11_Callback(hObject, eventdata, handles)% hObject handle to pushbutton11(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第五題(矩形窗) M1=20;M2=40;M3=160;%定義窗長度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);%相應(yīng)序列 x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);b1=boxcar(M1)'.*x1;%用窗函數(shù)截短 b2=boxcar(M2)'.*x2;b3=boxcar(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(b1)),'.');subplot(3,1,2);stem(abs(fft(b2)),'.');subplot(3,1,3);stem(abs(fft(b3)),'.'); %---Executes on button press in pushbutton5.function pushbutton5_Callback(hObject, eventdata, handles)% hObject handle to pushbutton5(see GCBO) % eventdata reservedto be defined in a future version of MATLAB% handles structure with handles and user data(see GUIDATA) %第五題(哈明窗) M1=20;M2=40;M3=160;%定義窗長度 n1=0:19;n2=0:39;n3=0:159; x1=0.5*cos(11*pi*n1/20)+cos(9*pi*n1/20);x2=0.5*cos(11*pi*n2/20)+cos(9*pi*n2/20);x3=0.5*cos(11*pi*n3/20)+cos(9*pi*n3/20);h1=hamming(M1)'.*x1;%窗函數(shù)截短 h2=hamming(M2)'.*x2;h3=hamming(M3)'.*x3;figure; subplot(3,1,1);stem(abs(fft(h1)),'.');subplot(3,1,2);stem(abs(fft(h2)),'.');subplot(3,1,3);stem(abs(fft(h3)),'.'); %---Executes on button press in pushbutton7.function pushbutton7_Callback(hObject, eventdata, handles) % hObject handle to pushbutton7(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第七題(矩形窗)N=10;wn=1/3; b1lp=fir1(N,wn,boxcar(N+1));%用fir1函數(shù)設(shè)計(jì)低通濾波器 b1hp=fir1(N,wn,'high',boxcar(N+1));%用fir1函數(shù)設(shè)計(jì)高通濾波器 M=1024;w=0:(M-1);t=0:10; h1lp=freqz(b1lp,1,w/M*2*pi);%得出頻率響應(yīng) h1hp=freqz(b1hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b1lp,'.');subplot(3,2,2);stem(t,b1hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h1lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h1hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h1lp));subplot(3,2,6); plot(w/M*2,angle(h1hp)); %---Executes on button press in pushbutton9.function pushbutton9_Callback(hObject, eventdata, handles)% hObject handle to pushbutton9(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %第七題(哈明窗)N=10;wn=1/3; b3lp=fir1(N,wn,hamming(N+1)); b3hp=fir1(N,wn,'high',hamming(N+1));M=1024;w=0:(M-1);t=0:10; h3lp=freqz(b3lp,1,w/M*2*pi);h3hp=freqz(b3hp,1,w/M*2*pi);figure; subplot(3,2,1);stem(t,b3lp,'.');subplot(3,2,2);stem(t,b3hp,'.');subplot(3,2,3); plot(w(1:(M/2))/M*2,abs(h3lp(1:(M/2))));subplot(3,2,4); plot(w(1:(M/2))/M*2,abs(h3hp(1:(M/2))));subplot(3,2,5); plot(w/M*2,angle(h3lp));subplot(3,2,6); plot(w/M*2,angle(h3hp)); 信息科學(xué)與工程學(xué)院 數(shù)字信號處理課程設(shè)計(jì)實(shí)驗(yàn)報告 課題名稱: 簡單信號濾波演示系統(tǒng) 學(xué)生姓名: 學(xué) 號: 專業(yè)班級: 指導(dǎo)老師: 實(shí)驗(yàn)時間: 2014.10.8 目 錄 第一章 概述.................................3 第二章 第三章 第四章第五章第六章 1.1 FIR、IIR概述.................................3 1.2題目要求......................................3 設(shè)計(jì)分析.............................5 2.1算法分析......................................5 2.2 在matlab中實(shí)現(xiàn)的分析........................6 程序?qū)崿F(xiàn).......................8 3.1 程序主體介紹..................................8 3.2 子程序........................................9 3.3 程序調(diào)試及運(yùn)行結(jié)果............................9 3.4 結(jié)果分析及問題分析...........................16 心得體會............................17 參考文獻(xiàn)............................18 源代碼..............................19 MATLAB 第一章 概述 1.1 FIR、IIR概述 數(shù)字濾波器是指輸入輸出均為數(shù)字信號,通過一定的運(yùn)算關(guān)系改變輸入信號所含頻率成分的相對比例或者濾除某些頻率成分的器件。數(shù)字濾波器與模擬濾波器相比數(shù)字濾波器具有精度高、穩(wěn)定、體積小、重量小、靈活等特點(diǎn)。主要分為兩種:有限脈沖響應(yīng)FIR和無限脈沖響應(yīng)IIR。設(shè)計(jì)濾波器的主要要求有兩種,一是幅頻特性,一是相頻特性。一般的濾波器主要是對幅頻特性作出要求,如果對輸出相頻特性也有要求,就需要用到線性相位濾波器。IIR濾波器的設(shè)計(jì)主要有兩類,一是借助于模擬濾波器設(shè)計(jì)進(jìn)行,二是直接在頻域或時域中進(jìn)行設(shè)計(jì)。FIR濾波器的設(shè)計(jì)不能借助于模擬濾波器,也有兩類設(shè)計(jì)方法,一是窗函數(shù)法,二是頻率采樣法。還有一種比較有效的方法是切比雪夫等波紋逼近法,需通過計(jì)算機(jī)輔助進(jìn)行。 1.2題目要求 設(shè)計(jì)一個工作流程如圖所示的信號濾波演示系統(tǒng): 圖2 濾波演示圖 ⑴ 信號發(fā)生器—根據(jù)信號選擇分為兩大類: ① 靜態(tài)型:直接輸入(或從文件讀取)測試信號序列; ② 動態(tài)型:輸入由多個不同頻率正弦信號疊加組合而成的模擬信號公式 100sin(2?f1t)?100sin(2?f2t)?...?100sin(2?fnt)采樣頻率(Hz)以及采樣點(diǎn)數(shù),動態(tài)生成該信號的采樣序列,作為測試信號。 ⑵ 頻譜分析—使用FFT 對產(chǎn)生的測試信號進(jìn)行頻譜分析并展示其幅頻、相頻特 性,指定需要濾除或保留的頻帶,通過選擇濾波器類型(IIR/FIR),確定對 應(yīng)的濾波器(低通、高通、帶通、帶阻)技術(shù)指標(biāo)。 ⑶ 濾波器設(shè)計(jì)—根據(jù)IIR/FIR 數(shù)字濾波器技術(shù)指標(biāo)設(shè)計(jì)濾波器,生成相應(yīng)的濾 波器系數(shù),并展示對應(yīng)的濾波器幅頻(衰減)、相頻特性。 ① IIR DF 設(shè)計(jì):使用雙線性變換法,可選擇濾波器基型(巴特沃斯或切比雪夫型); ② FIR DF 設(shè)計(jì):使用窗口法,可選擇窗口類型。 ⑷ 數(shù)字濾波—根據(jù)設(shè)計(jì)的濾波器系數(shù),對測試信號進(jìn)行濾波。 ① IIR DF:要求通過差分方程迭代實(shí)現(xiàn)濾波,未知初值置零處理; ② FIR DF:要求通過快速卷積實(shí)現(xiàn)濾波??梢赃x擇使用重疊相加或重疊保留法進(jìn)行卷積運(yùn)算,并動態(tài)展示卷積運(yùn)算的詳細(xì)過程。 ⑸ 輸出信號分析—展示濾波后信號的幅頻與相頻特性,分析是否滿足濾波要求。 對同一濾波要求,根據(jù)輸出信號頻譜,對比分析各類濾波器的差異。選做部分 將一段語音作為測試信號,通過頻譜展示和語音播放,對比分析濾波前后語音信號的變化,進(jìn)一步加深對數(shù)字信號處理的理解。 第二章 設(shè)計(jì)分析 2.1算法分析 此題目的實(shí)現(xiàn)可分為三個某塊的設(shè)計(jì)實(shí)現(xiàn):輸入信號模塊,設(shè)計(jì)濾波器模塊,濾波模塊。 首先明確各模塊間的數(shù)據(jù)依賴關(guān)系:在輸入信號模塊得到信號后,對信號 進(jìn)行頻域分析,從而確定濾波器的相關(guān)技術(shù)指標(biāo),根據(jù)濾波器的技術(shù)指標(biāo)與類型,在濾波器設(shè)計(jì)模塊完成濾波器的設(shè)計(jì),然后將濾波器的設(shè)計(jì)結(jié)果傳遞給濾波模塊,濾波模塊同時接收輸入信號,從而通過運(yùn)算,實(shí)現(xiàn)信號的濾波處理。從數(shù)據(jù)傳遞關(guān)系上分析,濾波模塊的實(shí)現(xiàn)依賴于其他模塊的數(shù)據(jù)輸出,因此放在最后設(shè)計(jì)。先設(shè)計(jì)輸入模塊。 因?yàn)榇嗽O(shè)計(jì)相對復(fù)雜,分模塊設(shè)計(jì),通過參數(shù)傳遞和接口實(shí)現(xiàn)分模塊設(shè)計(jì)即檢驗(yàn),提高程序的穩(wěn)定性與健壯性。 輸入的實(shí)現(xiàn)可以有兩種方式:靜態(tài)輸入和動態(tài)輸入。靜態(tài)輸入選擇從文本輸入數(shù)據(jù),將信號取樣值以矩陣的形式存放在文本中。采用文件的讀取就可以實(shí)現(xiàn),比較容易。動態(tài)輸入,即輸入由一系列頻率的正弦信號相加的組成的信號,需要經(jīng)過采樣的,注意在設(shè)置采樣頻率時一定要符合奈奎斯特準(zhǔn)則,提高采樣點(diǎn)數(shù),增加頻譜分辨率。最后輸出一采樣信號向量,傳遞給其余兩模塊。 濾波器的設(shè)計(jì),通過輸入信號的頻譜分析,設(shè)置濾波器的參數(shù),然后才可以設(shè)計(jì)濾波器。第一步需要總結(jié)設(shè)計(jì)濾波器需要哪些參數(shù),通過學(xué)習(xí)可以總結(jié),所有濾波器的參數(shù)有四個:通帶截止頻率、阻帶截止頻率、通帶最大衰減、阻帶最小衰減。 對濾波器的設(shè)計(jì)分兩類:FIR和IIR,二則所需的函數(shù)及設(shè)計(jì)方法不同。IIR采用借助于模擬濾波器的方式,包括巴特沃斯濾波器和切比雪夫?yàn)V波器兩種類型。FIR采用窗函數(shù)方式,有矩形窗、三角窗、漢明窗、漢寧窗、布萊克曼和凱塞窗。通過調(diào)用不同的函數(shù)來實(shí)現(xiàn)濾波器的設(shè)計(jì)。特別在實(shí)現(xiàn)窗函數(shù)濾波器時,各個函數(shù)的主要區(qū)別是不同的頻率采樣,可以通過選擇結(jié)構(gòu)實(shí)現(xiàn),簡化程序。通過濾波器的設(shè)計(jì)最后可以得到濾波器的系統(tǒng)函數(shù)H(z)的系數(shù)。分析濾波器的幅頻特性和相頻特性,如果不符合要求重新設(shè)定濾波器參數(shù)或者換成其他濾波器類型。如果性能符合要求,則將系數(shù)傳遞給濾波模塊。濾波模塊不調(diào)用濾波函數(shù),實(shí)現(xiàn)濾波功能根據(jù)濾波器類型的不同,有兩種方式可以選擇,一種是通過差分方程運(yùn)算,一種是通過線性卷積運(yùn)算。前者適合對IIR濾波器進(jìn)行濾波,后者適合對FIR濾波器進(jìn)行濾波。且線性卷積為實(shí)現(xiàn)對長序列的卷積運(yùn)算,采用重疊相加法,采用動態(tài)變化展示運(yùn)算過程。 2.2 在matlab中實(shí)現(xiàn)的分析 輸入模塊通過讀取文件和直接輸入數(shù)據(jù)運(yùn)算可以很容易實(shí)現(xiàn)。在輸入信號確定后,要對其進(jìn)行頻譜分析,從而確定濾波器的參數(shù)和類型(低通、高通、帶通、帶阻),此模塊作用也就完成,將數(shù)據(jù)分別用全局變量傳遞給下面的模塊。 設(shè)置模擬信號: 我采用的測試信號是兩個正弦信號疊加而成的信號,信號為 y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts)其中頻率f1=30;頻率f2=50;頻率f3=200;采樣頻率fs=3000;采樣間隔 Ts=1/fs;采樣點(diǎn)數(shù) N=1024;n=1:N 采集模擬信號的程序代碼: f1=30;% 頻率1 f2=50;% 頻率2 f3=200;% 頻率3 fs=3000;% 采樣頻率 Ts=1/fs;% 采樣間隔 N=1024;% 采樣點(diǎn)數(shù) n=1:N; y=sin(2*pi*f1*n*Ts)+sin(2*pi*f2*n*Ts)+sin(2*pi*f1*n*Ts);% 正弦波混合 頻譜分析: 使用FFT對產(chǎn)生的測試信號進(jìn)行頻譜分析并展示其幅頻特性與相頻特性,指定需要濾除的頻帶,通過選擇濾波器類型IIR,確定對應(yīng)的濾波器(低通、高通)技術(shù)指標(biāo)Fp、Fc、Rp、Rs。 濾波器的設(shè)計(jì): 根據(jù)以上技術(shù)指標(biāo)(通帶截止頻率、通帶最大衰減、阻帶截止頻率、阻帶最 小衰減),設(shè)計(jì)數(shù)字濾波器,生成相應(yīng)的濾波器系數(shù),并畫出對應(yīng)的濾波器 幅頻特性與相頻特性。分別設(shè)計(jì)巴特沃斯濾波器、切比雪夫I型濾波器、切 比雪夫II型濾波器、橢圓濾波器、yulewalk濾波器。 巴特沃斯和切比雪夫的濾波函數(shù)調(diào)用為: [N,Wc]=buttord(wp,ws,rp,rs);[N,Wc]=cheb1ord(wp,ws,rp,rs);[B,A]=butter(N,Wc,’property’);[B,A]=cheby1(N,rp,Wc,’property’); property對于低通和高通為’’,帶通’high’,帶阻’stop’;窗函數(shù)濾波器設(shè)計(jì)的調(diào)用函數(shù): 求窗函數(shù)的階數(shù): N=ceil((h*pi)/wdel);%wdel為窗函數(shù)的過渡帶寬,h對應(yīng)不同窗函數(shù)的值 wn=boxcar(N+1);wn=triang(N+1);wn=hanning(N+1);wn=hamming(N+1);wn=blackman(N+1);wn=kaiser(N+1,beta);%bata為kaiser的a參數(shù) B=fir1(N,ws,'property',wn);property對于低通和高通為’’,帶通’high’,帶阻’stop’; 數(shù)字濾波: 根據(jù)設(shè)計(jì)的濾波器系數(shù),對測試信號通過差分方程迭代實(shí)現(xiàn)濾波數(shù)字濾波,展示濾波后信號的幅頻特性與相頻特性,分析是否滿足濾波要求(對同一濾波要求,對比分析各類濾波器的差異)。 需要注意的是,窗函數(shù)對濾波參數(shù)的使用,需要通過運(yùn)算得到一窗函數(shù)階數(shù),對通帶最大衰減無使用。需要注意FIR和IIR對參數(shù)的不同利用。 濾波模塊:運(yùn)用差分方程運(yùn)算的濾波函數(shù),可以用循環(huán)調(diào)用簡單實(shí)現(xiàn)。動態(tài)展示線性卷積的重疊相加法可以用流程圖來說明: 第三章 MATLAB程序?qū)崿F(xiàn) 3.1 程序主體介紹 此程序界面也是采用GUI,不過是采用圖形用戶界面開發(fā)環(huán)境。和第一個對比,布局更加容易,很容易調(diào)整界面。但是在一些函數(shù)操作行會受一些限制,比如函數(shù)參數(shù)的傳遞,目前來說還是采用全局變量才能完成。 pushbutton1_Callback(hObject, eventdata, handles)%獲得輸入信號 uipanel11_SelectionChangeFcn(hObject, eventdata, handles)%獲取濾波器的設(shè)計(jì)參數(shù) uipanel15_SelectionChangeFcn(hObject, eventdata, handles)%設(shè)計(jì)濾波器 pushbutton4_Callback(hObject, eventdata, handles)%進(jìn)行濾波 以上是一些功能控件,需要注意的是他們的view ballcak屬性,對于groupbutton一組按鈕,需要選用SelectionChangeFcn,其余選擇callback屬性即可。另外,handles函數(shù)作用為傳遞的句柄,是一結(jié)構(gòu)體,調(diào)用時注意此處。其余和直接用函數(shù)創(chuàng)建GUI界面無太大區(qū)別。 3.2 子程序 3.2.1 IIR濾波器 FIR濾波器 巴特沃斯濾波器 3.2.2 矩形窗 三角窗 漢寧窗 哈明窗 3.3 程序調(diào)試及運(yùn)行結(jié)果 原始信號幅頻特性及相頻特性 巴特沃斯的幅頻特性及相頻特性 信號濾波后的幅頻特性及相頻特性 矩形窗的幅頻特性及相頻特性 信號濾波后的幅頻特性及相頻特性 三角窗的幅頻特性及相頻特性 信號濾波后的幅頻特性及相頻特性 漢寧窗的幅頻特性及相頻特性 信號濾波后的幅頻特性及相頻特性 哈明窗的幅頻特性及相頻特性 信號濾波后的幅頻特性及相頻特性 3.4 結(jié)果分析及問題分析 用雙線性變換法設(shè)計(jì)無限脈沖響應(yīng)數(shù)字濾波器(IIF DF)時,先把數(shù)字濾波器指標(biāo)轉(zhuǎn)換成模擬濾波器的指標(biāo),然后根據(jù)模擬濾波器的指標(biāo)設(shè)計(jì)模擬濾波器,再經(jīng)過線性變換把模擬濾波器轉(zhuǎn)換成數(shù)字濾波器。該系統(tǒng)要能夠設(shè)計(jì)巴特沃茲型低通、帶通、高通濾波器,并能夠輸入數(shù)字濾波器的性能指標(biāo),顯示出濾波器的階數(shù)和系數(shù)。該系統(tǒng)的關(guān)鍵部分是濾波器的設(shè)計(jì)部分,按照雙線性變換法設(shè)計(jì)濾波器的步驟進(jìn)行設(shè)計(jì)即可。 第四章 心得體會 本次課程設(shè)計(jì)可以稱為matlab和數(shù)字信號處理的綜合設(shè)計(jì),因?yàn)檫@次有一半的時間在研究matlab,有一半的時間在思考數(shù)字信號問題的解決。幾天下來收獲是很多的,對數(shù)字信號處理有了一次全面的回顧,而且也看到了matlab的神秘面容。只要是自己真正的努力去做了,就絕對不會后悔在課程設(shè)計(jì)上花費(fèi)的時間?,F(xiàn)在發(fā)現(xiàn)自己確實(shí)會的太少,而這次又學(xué)了太多,對自己以后的學(xué)習(xí)還是有鞭策意義的。 這次課程設(shè)計(jì)也使我認(rèn)識到了matlab的強(qiáng)大,或者進(jìn)一步說工具軟件有著你意想不到的功效,能節(jié)省你的時間,同時又能夠讓你從實(shí)踐上更深層次的認(rèn)識到所學(xué)知識的奇妙,而且可以同時明白了學(xué)習(xí)與實(shí)踐的相輔相成。對課程設(shè)計(jì)也是一直保持很高興趣的,雖然有時為它焦頭爛額,但是也會因此有柳暗花明的喜悅,任何事情都折射著一個普通的道理——付出才有回報。淺顯的道理,卻是需要我們用毅力來堅(jiān)持見證的。 具體來說,通過本次課程設(shè)計(jì),我掌握了MATLAB的基本運(yùn)用,尤其是其中GUI可視化圖形用戶界面的設(shè)計(jì),包括函數(shù)調(diào)用與在圖形用戶界面開發(fā)環(huán)境下的調(diào)用。函數(shù)的調(diào)用與參數(shù)的傳遞是兩個簡單卻很容易出錯的地方,自由細(xì)心才可以保證程序的健壯性。 對數(shù)字信號本身內(nèi)容的理解來說,全書的內(nèi)容確實(shí)是可以融合在這兩個課程設(shè)計(jì)題目中的,一個是DFT運(yùn)用,另一個是濾波器的設(shè)計(jì)和利用。對全書的內(nèi)容可以做出最好的概括。其中濾波器的設(shè)計(jì)中,調(diào)用了許多濾波函數(shù),這是本次實(shí)驗(yàn)有點(diǎn)欠缺的地方,但是仍然從整體上把握了整個濾波器的設(shè)計(jì)過程。 對于課程設(shè)計(jì)中出現(xiàn)的問題,解決的方式有兩種,一是自己解決??梢陨暇W(wǎng),查閱圖書和matlab的本身的幫助文件,不斷嘗試,自己修改錯誤,可以更好的反省。二是與同學(xué)相商。一加一不是等于二那么簡單的,相互交流才是進(jìn)步的最好方式。其中解決問題最重要的應(yīng)該是堅(jiān)持不懈,在遇到問題時,不放棄才有可能稱為最后的勝利者。 每次課程設(shè)計(jì)都收獲頗多,而且每次都對自己的學(xué)習(xí)態(tài)度做一次調(diào)整,這個的作用確實(shí)是很大的,希望以后更加珍惜的課程設(shè)計(jì)的時間。 第五章 參考文獻(xiàn) [1] 丁玉美等.數(shù)字信號處理 [M].西安:西安電子科技大學(xué)出版社,2002 [2] 程佩青.數(shù)字信號處理教程,第二版[M].北京:清華大學(xué)出版社,2001 [3] 趙樹杰等.數(shù)字信號處理[M].西安:西安電子科技大學(xué)出版社,1997 [4] 陳懷琛等.MATLAB 及在電子信息課程中的應(yīng)用[M],北京:電子工業(yè)出版社出 版,2002 [5] 余成波.數(shù)字信號處理及MATLAB實(shí)現(xiàn),第一版[M].北京:清華大學(xué)出版社,2008 [6] S.K.Mitra.Digital Signal Processing: A Computer Based Approach, 3rdEdition[M],New York, USA:McGraw-Hill,2000 [7] R.G.Lyons.Understanding Digital Signal Processing,2nd Edition[M].New Jersey, USA:Prentice Hall,2005 第六章 源代碼 function varargout = df(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename,...'gui_Singleton', gui_Singleton,...'gui_OpeningFcn', @df_OpeningFcn,...'gui_OutputFcn', @df_OutputFcn,...'gui_LayoutFcn', [] ,...'gui_Callback', []);if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1});end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else gui_mainfcn(gui_State, varargin{:});end function df_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); function varargout = df_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function edit1_Callback(hObject, eventdata, handles) function edit1_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit2_Callback(hObject, eventdata, handles) function edit2_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit3_Callback(hObject, eventdata, handles) function edit3_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit4_Callback(hObject, eventdata, handles) function edit4_CreateFcn(hObject, eventdata, handles)if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit5_Callback(hObject, eventdata, handles) function edit5_CreateFcn(hObject, eventdata, handles)if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function pushbutton1_Callback(hObject, eventdata, handles)f=zeros(1,4); f(1)=str2num(get(handles.edit2,'String'));f(2)=str2num(get(handles.edit1,'String'));f(3)=str2num(get(handles.edit3,'String'));f(4)=str2num(get(handles.edit4,'String')); T=str2num(get(handles.edit12,'String'));%采樣周期% fre=str2num(get(handles.edit5,'String'));%采樣頻率% t=0:1/fre:T; xn=10*sin(2*pi*t*f(1))+10*sin(2*pi*t*f(2))+10*sin(2*pi*t*f(3))+10*sin(2*pi*t*f(4)); set(handles.axes15,'userdata',xn);%將Xn放在用戶數(shù)據(jù)userdata% yn3=abs(fft(xn));%快速傅立葉變換(符頻特性)% n1=[0:length(yn3)-1]/length(yn3)*fre;%橫坐標(biāo)% axes(handles.axes12);%坐標(biāo)系編號% stem(n1,yn3,'.'); axis([0,fre/2,0,max(yn3)]);%坐標(biāo)軸單位控制% title('信號的幅頻特性');xlabel('頻率(Hz)');ylabel('|X(ejw)|'); yn4=angle(fft(xn));%相頻特性% n4=[0:length(yn4)-1]/length(yn4)*fre;axes(handles.axes16);stem(n4,yn4,'.'); axis([0,fre/2,min(yn4),max(yn4)]);title('信號的相頻特性');xlabel('頻率(Hz)');ylabel('相位'); function edit6_Callback(hObject, eventdata, handles) function edit6_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit7_Callback(hObject, eventdata, handles) function edit7_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit8_Callback(hObject, eventdata, handles) function edit8_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit9_Callback(hObject, eventdata, handles) function edit9_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function pushbutton2_Callback(hObject, eventdata, handles)xn=get(handles.axes15,'userdata');fre=str2num(get(handles.edit5,'String')); fp=str2num(get(handles.edit6,'String'));%通帶最大頻率 % fs=str2num(get(handles.edit7,'String'));%阻帶最小頻率% rp=str2num(get(handles.edit8,'String'));rs=str2num(get(handles.edit9,'String'));wp=2*fp/fre;ws=2*fs/fre; [N,wc]=buttord(wp,ws,rp,rs,'s');%求階數(shù),截止頻率% [B,A]=butter(N,wc,'s');%巴特沃茲模擬低通濾波器系數(shù)% [Bz,Az]=bilinear(B,A,1); [H,w]=freqz(Bz,Az);%分析數(shù)字濾波器% axes(handles.axes14);plot(w/pi,abs(H)); axis([0,1,0,max(abs(H))]);title('巴特沃茲的幅頻特性');xlabel('w/π'); ylabel('|X(ejw)|');axes(handles.axes17);plot(w/pi,angle(H));title('巴特沃茲的相頻特性');xlabel('頻率(Hz)');ylabel('相位'); yn2=filter(Bz,Az,xn);%迭代法求解濾波信號% yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信號濾波后的幅頻特性');xlabel('頻率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信號濾波后的相頻特性');xlabel('頻率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function edit10_Callback(hObject, eventdata, handles)function edit10_CreateFcn(hObject, eventdata, handles) if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function edit11_Callback(hObject, eventdata, handles) function edit11_CreateFcn(hObject, eventdata, handles)if ispc set(hObject,'BackgroundColor','white');else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor'));end function pushbutton5_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi; Bt=ws-wp; N0=ceil(1.8*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,boxcar(N));%單位序列相應(yīng)% yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('矩形窗的損耗函數(shù)');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn); n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('矩形窗的相頻特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);%重疊相加法求濾波后序列% yn=abs(fft(yn2));n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信號濾波后的幅頻特性');xlabel('頻率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信號濾波后的相頻特性');xlabel('頻率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function pushbutton6_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi; Bt=ws-wp; N0=ceil(6.1*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,bartlett(N)); yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('三角窗的損耗函數(shù)');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn);n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('三角窗的相頻特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信號濾波后的幅頻特性');xlabel('頻率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信號濾波后的相頻特性');xlabel('頻率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function pushbutton7_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi;if(fp N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,hanning(N));else Bt=wp-ws; N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,'high',hanning(N));end yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('漢寧窗的損耗函數(shù)');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn); n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('漢寧窗的相頻特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信號濾波后的幅頻特性');xlabel('頻率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信號濾波后的相頻特性');xlabel('頻率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); function pushbutton8_Callback(hObject, eventdata, handles) xn=get(handles.axes15,'userdata');fp=str2num(get(handles.edit10,'String'));fs=str2num(get(handles.edit11,'String'));fre=str2num(get(handles.edit5,'String'));wp=2*fp/fre*pi;ws=2*fs/fre*pi;if(fp N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,hamming(N));else Bt=wp-ws; N0=ceil(6.2*pi/Bt);N=N0+mod(N0+1,2);wc=(wp+ws)/2/pi; hn=fir1(N-1,wc,'high',hamming(N));end yn=abs(fft(hn));yn=20*log10(yn); n1=[0:length(yn)-1]/length(yn)*2;axes(handles.axes14);plot(n1,yn); title('哈明窗的損耗函數(shù)');xlabel('w/π'); ylabel('20log|Hg(w)|');axis([0,1,min(yn),max(yn)]);axes(handles.axes17);yn=angle(hn); n1=[0:length(yn)-1]/length(yn)*2;plot(n1,yn); title('哈明窗的相頻特性');xlabel('w/π'); ylabel('相位'); axis([0,1,min(yn),max(yn)]); yn2=fftfilt(hn,xn,512);yn=abs(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes15);stem(n1,yn,'.'); title('信號濾波后的幅頻特性');xlabel('頻率(Hz)');ylabel('|X(ejw)|');axis([0,fre/2,0,max(yn)]);yn=angle(fft(yn2)); n1=[0:length(yn)-1]/length(yn)*fre;axes(handles.axes18);stem(n1,yn,'.'); title('信號濾波后的相頻特性');xlabel('頻率(Hz)'); ylabel('相位'); axis([0,fre/2,min(yn),max(yn)]); pushbutton1_Callback(hObject, eventdata, handles); %---Executes during object creation, after setting all properties.function axes12_CreateFcn(hObject, eventdata, handles)% hObject handle to axes12(see GCBO) % eventdata reservedhandles not created until after all CreateFcns called % Hint: place code in OpeningFcn to populate axes12 %---Executes on mouse press over axes background.function axes12_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to axes12(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) % Hints: get(hObject,'String')returns contents of edit12 as text % str2double(get(hObject,'String'))returns contents of edit12 as a double %---Executes during object creation, after setting all properties.function edit12_CreateFcn(hObject, eventdata, handles)% hObject handle to edit12(see GCBO) % eventdata reservedhandles not created until after all CreateFcns called % Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end %---If Enable == 'on', executes on mouse press in 5 pixel border.%---Otherwise, executes on mouse press in 5 pixel border or over edit5.function edit5_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to edit5(see GCBO) % eventdata reservedto be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA) %---Executes during object deletion, before destroying properties.function edit12_DeleteFcn(hObject, eventdata, handles)% hObject handle to edit12(see GCBO) % eventdata reserved-to be defined in a future version of MATLAB % handles structure with handles and user data(see GUIDATA)第四篇:現(xiàn)代信號處理課程設(shè)計(jì)報告(中南大學(xué))
第五篇:數(shù)字信號處理課設(shè)