1. 程式人生 > >【DSP學習筆記】基於CCS5.5的FIR濾波器設計

【DSP學習筆記】基於CCS5.5的FIR濾波器設計

一、概述

        本文是基於TMS320C5510晶片設計的FIR濾波器。介紹利用matlab和CCS5.5設計FIR濾波器的過程和模擬結果。輸入訊號包含100Hz和200Hz兩個成分,通過matlab生成一個FIR低通濾波器的各階係數,利用CCS完成訊號處理並且展示模擬結果。最後介紹“Tools”工具欄中“Graph”變灰解決方法。

二、基本步驟

1、濾波器係數生成

(1)呼叫FDATool工具。Matlab提供強大的濾波器設計工具FDATool(filter design& analysis Tool),可以完成濾波器的設計、分析評估等功能。

       在matlab應用程式視窗點選“filter design & analysis Tool”,如圖1。

圖1 filterdesign & analysis Tool工具

(2)濾波器生成。開啟FDATool工具後,預設為等紋波濾波器,也可以選用其他濾波器,在這裡預設即可。根據所給訊號的頻率可以設計引數為:

        通帶頻率Fpass=120HZ,截止頻率Fstop=160HZ,通帶紋波wpass=1dB,阻帶衰減為80dB。設計系數如下圖2所示。其中“Fs”為取樣頻率,可根據需要設定,當然也可以改動測試效果,選擇效果最好的值。


圖2 濾波器生成引數設定 

(3)C語言標頭檔案生成。用C語言在CCS環境下實現FIR濾波器時,其濾波器係數需要新增至工程中,主要方法有兩種,一種是直接將matlab生成的係數寫複製在CCS程式碼中,另一種就是將生成的係數以c語言標頭檔案的形式新增至工程,主函式呼叫該檔案即可。
        此處以第二種標頭檔案的形式新增至FIR專案中。標頭檔案生成方式如下:點選選單欄的Targets選項中的“Code Composer Studio”,如下圖3:


圖3 標頭檔案生成入口

點選後出現如下介面,如圖4。

圖4  標頭檔案生成介面

引數說明:

        numerator為係數陣列名,預設即可,numerator  length為係數陣列長度,為靜態常量,名字預設即可。

我在CCS環境中是以long型整數形式進行FIR濾波,在計算卷積過程中為防止溢位,此處的Export as 處可選擇16位的有符號整形資料。

        生成後頭檔案中就包含了濾波器引數,以陣列的形式儲存。詳細程式碼見本文後。標頭檔案儲存路徑可以根據自己需要選擇,方便自己找到即可。

2、FIR濾波器C語言實現。

        由於之前使用的是CCS5.5環境,並且使用的TMS320C5510進模擬測試,因此此時實驗繼續使用CCS5.5和TMS320C5510進行模擬測試。程式使用C語言編寫,資料型別為整數。

(1)建立工程新增檔案。建立工程,工程結構如下圖5所示。將在matlab中生成的c語言標頭檔案新增至CCS工程資料夾下面。在matlab生成的CCS標頭檔案中,需要呼叫matlab的標頭檔案。將標頭檔案拷貝到工程路徑下即可。


圖5 工程目錄

注意:只拷貝生成的標頭檔案後,執行可能會出錯,提示缺失某個檔案“tmwtypes.h”。該檔案在matlab安裝路徑下。可以直接在安裝路徑下搜尋該檔案,直接拷貝到工程路徑下即可。

(2)輸入訊號生成。程式碼如下:

        for(i=0;i<Length;i++)

input[i]=1024*sin(w1*i)+1024*sin(w2*i);       //待濾波訊號,乘以1024轉換為Q10格式(sin範圍為-1~1,將其轉換為整數格式)

       因為計算時,其他資料型別都為整數,因此需要將-1~+1的小數格式轉換為整數,不然在-1~+1的小數資料絕對值不超過1,那麼在記憶體中都將被視作0,會導致波形嚴重失真。所以在此處需要將小數資料轉換為整數型,又因為最後輸出資料型別設定為long型,為了保證在計算過程中不溢位,Q值不能設定過大。

       因濾波器係數我選擇的是16位資料,所以Q值可以設定為15。但是,嘗試過Q值為15,因資料過大,會嚴重影響計算機計算速度,在Q值為10時,計算速度可以容忍,也滿足精度要求。所以此處我選擇Q值為10。

(3)線性卷積計算

    公式以及過程如下:


for(n=0;n<Length+BL;n++)               //卷積計算

{

yn=0;

for(m=0;(m<BL)&&(m<n);m++)

yn+=B[m]*input[n-m];

output[n]=yn;

}

       已知h(n)的長度為BL,x(n)的長度為Length,利用外層迴圈控制n,內層迴圈控制m,將卷積計算的公式可表示為上述程式碼。

3、CCS模擬測試

(1)點選除錯按鈕,出現如下介面:


(2)設定斷點。在while(1)處設定斷點。如下圖:


(3)執行程式。點選除錯欄中的“step return”直接執行到此處,並且一直執行程式。如下圖


(4)波形生成。可以利用CCS軟體自帶的graph工具測試輸入輸出波形,並且可以對訊號進行譜分析。操作過程如下圖所示:

(5)顯示引數設定。

    a.時域顯示引數設定,如下圖,設定完成後點選OK即可顯示曲線。


引數說明:

Acquisition Buffer Size:表示通過模擬器從DSP的記憶體中讀取的資料的大小。由於程式裡用於儲存訊號的陣列大小是1024,這裡我們設定成1024,也可以設定成比他更小的值,這樣就只能看到訊號的部分影象。

Dsp Data Type:資料型別設定,因為在程式中使用的是long型資料,在這裡需要設定成32位整形資料。

Index Increment:索引增量,表示每個資料點序號的相差值,這裡是逐點顯示的,因此預設設定為1,如果想要每隔一個點顯示一個那麼就應該設定成2。

Q_Value:Q值,一般這不常用,預設。

Sampling Rate Hz:以Hz為單位的取樣率,在這裡我們的取樣率是4096,因此設定成4096。

Start Address:開始地址,表示要顯示的陣列的首地址,假設我們現在想要看的是陣列input因此,設定這裡設定成input。

Auto Scale:自動調整顯示比例使其適應整個顯示視窗,預設即可。

Axis Display :顯示座標軸,預設即可。

Data Plot Style:資料繪製型別,有Line和Bar兩種,這裡選擇Line。

Display Data Size:顯示資料大小,表示要將多少個點的資料進行顯示,注意這個值一定要小於等於Acquisition Buffer Size,這裡設定成1024。

Grid Style:網格型別,有 NoGrid, Minor Grid, Major Grid三種選項,預設即可。

Magnitude Display Scale:幅值顯示型別,有Linear(線性的)Logarithmic(對數的),預設即可。

Time Display Unit:顯示時間的單位有sample,s, ms, us幾種可選,其中sample表示顯示的點的序號,預設即可。

Use Dc Value For Graph:是否使用Dc值,一般不常用,預設即可。

    b.頻譜顯示引數設定,如下圖。


引數說明:部分引數和時域顯示時的引數相同,有部分不同如下:

Signal Type :訊號型別,有Real,Complex這兩種,此處訊號資料均為實資料,因此我們選擇Real,如果資料型別是Complex,選擇Complex。

Frequency Display Unit :頻率顯示單位,有Hz,KHz,MHz三種,這裡選擇Hz。

FFT Order :FFT的階數,由它來決定FFT Frame Size,例如 FFT Order 設定為5 那麼FFT Frame Size 就為32 = 2^5。這裡我們設定成12,那麼FFT Frame Size就是4096。

FFT Frame Size :FFT做變換的點數,FFT Order決定,此處選擇4096點FFT。

FFT Window Function :FFT窗函式,選擇做FFT變換時採用什麼窗函式,有Rectangular(矩形窗),Bartlett,Blackman,Hamming,Hanning,選擇什麼窗函式根據實際的需求來決定到底採用哪一個窗函式,預設即可。

(6)波形顯示

    a.濾波前訊號時域曲線。訊號波形如下圖,由圖可以看出,濾波前為兩個訊號的疊加。


    b.濾波前訊號頻譜圖。濾波前頻譜如下圖,在100Hz和200Hz處有頻譜分量,符合所給訊號頻譜曲線。


    c.濾波後訊號時域曲線。按照上面時域顯示引數方法設定引數,就會生成濾波後的訊號時域曲線,如下圖所示。由圖可以看出,濾波後訊號近似為一正弦波訊號。

    d.濾波後訊號頻譜圖。按照上述頻譜圖引數設定方法設定引數,就會生成濾波後訊號頻譜圖,如下圖所示。

       由頻譜圖可以看出,濾波後訊號只有一個100Hz頻率分量,說明設計的濾波器已經將較高頻率的訊號濾除,達到訊號處理的目的。


4、C語言源程式。

#include "stdio.h"
#include "fdacoefs.h"
#include <math.h>
#include <stdlib.h>

#define Length 1024
#define pi 3.1415926

int fs=4096;	//取樣頻率
int f1=100;		//訊號頻率
int f2=200;		//噪聲頻率

#define w1 2*pi*f1/fs	//訊號角頻率
#define w2 2*pi*f2/fs	//噪聲角頻率

long yn;				//儲存濾波後結果,32位長整型
long input[Length];		//
long output[Length];
int i;


void main() {
	int m,n;

	for(i=0;i<Length;i++)
			input[i]=1024*sin(w1*i)+1024*sin(w2*i);		//待濾波訊號,乘以1024轉換為Q10格式(sin範圍為-1~1,將其轉換為整數格式)

	for(n=0;n<Length+BL;n++)				//卷積計算
	{
		yn=0;
		for(m=0;(m<BL)&&(m<n);m++)
			yn+=B[m]*input[n-m];
		output[n]=yn;
	}
	while(1);
	
}
5、濾波器係數標頭檔案。可以自己開啟自己生成的檔案檢視。
/*
 * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
 * Generated by MATLAB(R) 8.3 and the Signal Processing Toolbox 6.21.
 * Generated on: 06-May-2018 13:55:04
 */

/*
 * Discrete-Time FIR Filter (real)
 * -------------------------------
 * Filter Structure  : Direct-Form FIR
 * Filter Length     : 260
 * Stable            : Yes
 * Linear Phase      : Yes (Type 2)
 */

/* General type conversion for MATLAB generated C-code  */
#include "tmwtypes.h"
/* 
 * Expected path to tmwtypes.h 
 * G:\matlab2014a\extern\include\tmwtypes.h 
 */
/*
 * Warning - Filter coefficients were truncated to fit specified data type.  
 *   The resulting response may not match generated theoretical response.
 *   Use the Filter Design & Analysis Tool to design accurate
 *   int16 filter coefficients.
 */
const int BL = 260;
const int16_T B[260] = {
       -2,      0,      0,      1,      1,      3,      4,      6,      9,
       12,     16,     20,     25,     30,     36,     43,     49,     56,
       63,     69,     76,     81,     86,     89,     91,     92,     91,
       89,     84,     78,     70,     61,     49,     37,     23,      9,
       -5,    -19,    -33,    -45,    -56,    -65,    -72,    -76,    -78,
      -76,    -71,    -64,    -53,    -40,    -25,     -9,      9,     27,
       44,     61,     76,     88,     97,    103,    104,    102,     95,
       84,     69,     50,     29,      5,    -21,    -46,    -72,    -95,
     -116,   -133,   -145,   -152,   -153,   -148,   -136,   -118,    -94,
      -64,    -31,      7,     46,     85,    124,    159,    190,    215,
      232,    241,    240,    229,    207,    175,    134,     83,     26,
      -38,   -104,   -171,   -237,   -298,   -351,   -395,   -425,   -440,
     -437,   -415,   -373,   -310,   -225,   -120,      4,    147,    304,
      474,    654,    838,   1024,   1207,   1383,   1547,   1697,   1827,
     1936,   2020,   2077,   2106,   2106,   2077,   2020,   1936,   1827,
     1697,   1547,   1383,   1207,   1024,    838,    654,    474,    304,
      147,      4,   -120,   -225,   -310,   -373,   -415,   -437,   -440,
     -425,   -395,   -351,   -298,   -237,   -171,   -104,    -38,     26,
       83,    134,    175,    207,    229,    240,    241,    232,    215,
      190,    159,    124,     85,     46,      7,    -31,    -64,    -94,
     -118,   -136,   -148,   -153,   -152,   -145,   -133,   -116,    -95,
      -72,    -46,    -21,      5,     29,     50,     69,     84,     95,
      102,    104,    103,     97,     88,     76,     61,     44,     27,
        9,     -9,    -25,    -40,    -53,    -64,    -71,    -76,    -78,
      -76,    -72,    -65,    -56,    -45,    -33,    -19,     -5,      9,
       23,     37,     49,     61,     70,     78,     84,     89,     91,
       92,     91,     89,     86,     81,     76,     69,     63,     56,
       49,     43,     36,     30,     25,     20,     16,     12,      9,
        6,      4,      3,      1,      1,      0,      0,     -2
};

三、“Tools”工具欄中“Graph”變灰解決方法。

        在模擬的過程中,當關掉模擬波形視窗後,想再次進行模擬測試時,會出現tools工具欄中的“Graph”變灰而不能使用的情況。網上給了一些方法,比如重新建立工作區,此方法很奏效,因為重新建立了工作區,所有的都是新的,當然可以再次模擬,但是也只能模擬一次。為了在同一個工作區中繼續可以模擬,可採用如下方法。

        到目前工程所在的工作區檔案路徑下,找到如下圖檔案,刪除該檔案即可,若還是灰色的,將CCS關掉重啟即可。


    學習DSP愉快!

相關推薦

DSP學習筆記基於CCS5.5的FIR濾波器設計

一、概述        本文是基於TMS320C5510晶片設計的FIR濾波器。介紹利用matlab和CCS5.5設計FIR濾波器的過程和模擬結果。輸入訊號包含100Hz和200Hz兩個成分,通過matlab生成一個FIR低通濾波器的各階係數,利用CCS完成訊號處理並且展示模

ALB學習筆記基於事件觸發方式的串行通信接口數據接收案例

except 和數 從數據 發送數據 exceptio 工作原理 實時 double 窗體 基於事件觸發方式的串行通信接口數據接收案例 廣東職業技術學院 歐浩源 1、案例背景 之前寫過一篇《基於多線程方式的串行通信接口數據接收案例》的博文,討論了采用輪詢方

ALB學習筆記基於.NET環境的高頻RFID卡讀寫設備的基本操作案例

範例 write load rgs 顯示 職業 ner num cte 基於.NET環境的高頻RFID卡讀寫設備的基本操作案例 廣東職業技術學院 歐浩源 1、引言 RFID高頻卡在我們的日常生活中隨處可見,是物聯網應用中不可或缺的一個重要部分,也是全國職業

機器學習筆記基於k-近鄰演算法的數字識別

更多詳細內容參考《機器學習實戰》 k-近鄰演算法簡介 簡單的說,k-近鄰演算法採用測量不同特徵值之間的距離方法進行分類。它的工作原理是:存在一個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每個資料與所屬分類的對應關係。輸入沒

PHP學習筆記一個基於PHP的簡版後臺HTTP介面測試案例

專案越寫越大,多多少少會有點不敢運行了,就像下面這幅圖一樣(皮一下^ . ^) 不過還是得硬著頭皮去測試,手動測試?是有點浪費時間了,,在此分享一個自動測試的小指令碼,僅供參考。 公共方法 <?php /** * Created by PhpStorm. * Use

51微控制器學習筆記基於STC89C52製作的交通訊號燈

一、簡介     近來學(玩)了下已經好久沒碰的51,心血來潮自己DIY了一個交通訊號燈模型。沒有什麼創新之處,就是復(dao)習(gu)復(dao)習(gu)了下51的定時器中斷、外部中斷以及最小系統電路,熟悉了下74HC595的用法和數碼管。因為好久沒碰51了導致數

深度學習筆記(二)基於MNIST資料集的神經網路實驗

一、介紹 MNIST(Mixed National Institute of Standards and Technology database)是網上著名的公開資料庫之一,是一個入門級的計算機視覺資料集,它包含龐大的手寫數字圖片。 無論我們學習哪門程式語言

FLA學習筆記7:基於Opterator Precedence(算符優先)的LL(1)語法分析

簡述 課本第四章的遞迴下降和表驅動都是自頂向下的,即通過推導得到能夠完全匹配輸入串的推導式。 第五章的優先分析法和第六章的LR分析是自底向上的(規約得到開始符)。 第五章的簡單優先分析法是規範規約(左規約),而算符優先分析法不是規範規約,並且只考慮終結符之

強化學習筆記6.4 基於值函式逼近的強化學習方法-TD Q-learning線性逼近程式碼實現

針對一個迷宮問題,設計TD Q-learning線性逼近演算法(異策略)。 迷宮圖示見下圖,其中紅色部分為障礙物,綠色部分為出口: 使用的模型是:線性模型 輸入是狀態的特徵,這裡是25維的one-hot編碼 輸出是動作對應的4維陣列 使用t

JAVAWEB學習筆記12_Http&Tomcat

請求重定向 san res tor tomcat啟動 zha rac pac b- 一、Http協議 1.什麽是Http協議 HTTP,超文本傳輸協議(HyperText Transfer Protocol)是互聯網上應用最為廣泛的 一種網絡協議。所有的WWW文

extjs6學習筆記1.1 初始:創建項目

workspace 學習 分享 pps cnblogs log -i 學習筆記 apps 創建工作空間 sencha generate workspace /path/to/workspace 使用sencha創建應用 sencha

extjs6學習筆記1.2 初始:MVC MVVM

控制 進行 nbsp 例如 ges 如果 image 初始 互動 模型 這表示數據層。該模型可以包含數據驗證和邏輯來保持數據。在 ext js 中, 大多數模型都與一個數據存儲一起使用。 視圖 這表示用戶界面。 是用戶在屏幕上看到的組

JAVAWEB學習筆記13_servlet

eight 生命周期 sys blog source con 相對 對象創建 功能 JavaWeb核心之Servlet 教學導航 學習目標: 案例一、完成用戶登錄功能 案例二、記錄成功登錄系統的人次 一、Servlet簡介 1.什麽是Servlet Servlet

JAVAWEB學習筆記16_session&cookie

發送 學習筆記 獲得 tab esp http 應用 區分 pac 會話技術Cookie&Session 學習目標 案例一、記錄用戶的上次訪問時間---cookie 案例二、實現驗證碼的校驗----session 一、會話技術簡介 1.存儲客

JAVAWEB學習筆記23_Listener和郵箱服務器

添加 .get 接收 監聽 lin 感知 一個 rate 包括 監聽器Listener 學習目標 案例-使用監聽器完成定時生日祝福 一、監聽器Listener javaEE包括13門規範 在課程中主要學習 servlet技術 和 jsp技術 其中

extjs6學習筆記0.1 準備:基礎概念(02)

json over cal 類的屬性 tab 常用事件 data 微軟 基於 Ext 類 Ext 是一個全局單例的對象,在 Sencha library 中它封裝了所有的類和許多實用的方法。許多常用的函數都定義在 Ext 對象裏。它還提供了像其他類中一些頻繁使用的方法

extjs6學習筆記1.7 初始:加載第三方庫

sum pro eve owa spec expect mapview cap ply https://www.sencha.com/blog/integrating-ext-js-with-3rd-party-libraries-2/ Introduction

JAVAWEB學習筆記22

ont 交換 開發 異步校驗 什麽是 zhang add 一個 url Js原生Ajax和Jquery的Ajax 學習目標 案例1-異步校驗用戶名是否存在 案例2-站內查詢 一、Ajax概述 1.什麽是同步,什麽是異步 同步現象:客戶端發送請

JAVAWEB學習筆記17

lose 常用屬性 註釋 作用 enter tps img 客戶 mage 動態頁面技術(JSP/EL/JSTL) 學習目標 案例:完成商品的列表的展示 一、JSP技術 1.jsp腳本和註釋 jsp腳本: 1)<%java代碼%> -

extjs6學習筆記1.9 初始: Mixins

另一個 筆記 extjs 微軟 mage extjs6 名稱 img pan Mixin允許我們使用一個類的函數作為另一個類的函數而不繼承。 Mixins可以使用mixins關鍵字定義,並將值指定為JSON對象,其中屬性的名稱應該是要使用的方法的名稱,屬性的值