嵌入式ARM設計編程(五) 實現信號的FIR濾波操作

語言: CN / TW / HK

文章和代碼已歸檔至【Github倉庫:hardware-tutorial】,需要的朋友們自取。或者關注公眾號【AIShareLab】,回覆 嵌入式 也可獲取。

一、實驗目的

通過實驗瞭解嵌入式彙編語言程序結構,完成文件讀寫操作,實現對信號的濾波處理。

二、實驗環境

1、硬件:PC 機

1、軟件:ADS1.2 集成開發環境

三、實驗要求

(1)自行設計一個FIR的低通濾波器(7階以上),可以採用Matlab等其他工具軟件設計,也可以直接給定濾波器係數。

(2)生成一個1000點的信號,可以採用Matlab等其他工具軟件生成,也可以錄製一個聲音文件,也可以生成一個正弦波信號。

(3)對該信號添加高斯白噪聲噪聲。

(4)按照實驗要求編寫彙編語言源程序。

(5)對彙編源程序進行編譯、彙編。

(6)對程序進行調試。

(7)觀察程序運行結果,給出信號原始波形和信號濾波以後的波形,説明濾波的效果。

四、實驗代碼

程序代碼如下:

其中濾波器的設計,信號的生成以及波形及頻譜圖的生成均借用Matlab完成

```

include

include

define Length 1024

define pi 3.1415926

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

define w1 2pif1/fs //信號角頻率

define w2 2pif2/fs //噪聲角頻率

int i; long input[Length]; // long output[Length]; int min( int a, int b); const int BL = 347; const int B[347] = { -2, 0, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6, 8, 10, 12, 15, 18, 21, 24, 27, 31, 34, 38, 42, 46, 49, 53, 56, 60, 62, 65, 67, 68, 69, 69, 69, 67, 65, 62, 59, 54, 49, 44, 37, 30, 23, 15, 7, -1, -9, -17, -24, -32, -38, -44, -49, -53, -56, -58, -58, -57, -55, -52, -48, -42, -35, -28, -19, -10, 0, 10, 20, 30, 39, 48, 57, 64, 70, 74, 77, 78, 78, 75, 71, 65, 58, 49, 38, 26, 13, -1, -15, -30, -44, -58, -71, -83, -94, -102, -109, -113, -115, -115, -111, -105, -96, -84, -70, -54, -36, -16, 5, 27, 49, 71, 93, 113, 131, 147, 161, 171, 178, 181, 180, 174, 164, 150, 131, 109, 82, 52, 19, -16, -53, -91, -128, -166, -201, -234, -263, -289, -309, -323, -330, -330, -322, -305, -280, -246, -203, -151, -90, -21, 55, 139, 228, 323, 422, 524, 629, 733, 837, 939, 1037, 1131, 1218, 1299, 1371, 1433, 1486, 1528, 1558, 1576, 1582, 1576, 1558, 1528, 1486, 1433, 1371, 1299, 1218, 1131, 1037, 939, 837, 733, 629, 524, 422, 323, 228, 139, 55, -21, -90, -151, -203, -246, -280, -305, -322, -330, -330, -323, -309, -289, -263, -234, -201, -166, -128, -91, -53, -16, 19, 52, 82, 109, 131, 150, 164, 174, 180, 181, 178, 171, 161, 147, 131, 113, 93, 71, 49, 27, 5, -16, -36, -54, -70, -84, -96, -105, -111, -115, -115, -113, -109, -102, -94, -83, -71, -58, -44, -30, -15, -1, 13, 26, 38, 49, 58, 65, 71, 75, 78, 78, 77, 74, 70, 64, 57, 48, 39, 30, 20, 10, 0, -10, -19, -28, -35, -42, -48, -52, -55, -57, -58, -58, -56, -53, -49, -44, -38, -32, -24, -17, -9, -1, 7, 15, 23, 30, 37, 44, 49, 54, 59, 62, 65, 67, 69, 69, 69, 68, 67, 65, 62, 60, 56, 53, 49, 46, 42, 38, 34, 31, 27, 24, 21, 18, 15, 12, 10, 8, 6, 5, 4, 3, 2, 1, 1, 0, 0, 0, 0, -2 };

int min( int a, int b) { return a < b? a : b; }

int main() { int L,n; FILE fp,fp1; for(i=0;i<Length;i++){ input[i]=1024sin(w1i)+1024sin(w2i); //待濾波信號,乘以1024轉換為Q10格式(sin範圍為-1~1,將其轉換為整數格式)} /for(n=0;n<Length+BL;n++) //卷積計算 { output[n] = 0; for(m=0;(m<BL)&&(m<n);m++) output[n]+=B[m]input[n-m]; }/ for(n = 0; n < Length; n++) {
output[n] = 0; for(L = 0; L < min( n, BL); L++) {
output[n] += (B[L]
input[n-L]); } } fp1 = fopen("./input.txt","w"); if(fp1==NULL) { printf("error\n"); exit(0); } for(i=0;i<Length;i++) { fprintf(fp1,"%d\n",input[i]); } fclose(fp1); fp = fopen("./numbers.txt","w"); if(fp==NULL) { printf("error\n"); exit(0); } for(i=0;i<Length;i++) { fprintf(fp,"%d\n",output[i]); } fclose(fp); printf("Finish!"); return 0; ```

輸入信號波形圖如下:

輸入信號頻譜圖如下:

輸出信號波形圖如下:

輸出信號頻譜圖如下:


歡迎關注公眾號【AIShareLab】,一起交流更多相關知識,前沿算法,Paper解讀,項目源碼,面經總結。