写点什么

嵌入式 ARM 设计编程 (五) 实现信号的 FIR 滤波操作

作者:timerring
  • 2023-02-18
    山东
  • 本文字数:2588 字

    阅读完需:约 8 分钟

文章和代码已归档至【Github 仓库:hardware-tutorial】,需要的朋友们自取。或者关注公众号【AIShareLab】,回复 嵌入式 也可获取。

一、实验目的

通过实验了解嵌入式汇编语言程序结构,完成文件读写操作,实现对信号的滤波处理。

二、实验环境

1、硬件:PC 机


1、软件:ADS1.2 集成开发环境

三、实验要求

(1)自行设计一个 FIR 的低通滤波器(7 阶以上),可以采用 Matlab 等其他工具软件设计,也可以直接给定滤波器系数。


(2)生成一个 1000 点的信号,可以采用 Matlab 等其他工具软件生成,也可以录制一个声音文件,也可以生成一个正弦波信号。


(3)对该信号添加高斯白噪声噪声。


(4)按照实验要求编写汇编语言源程序。


(5)对汇编源程序进行编译、汇编。


(6)对程序进行调试。


(7)观察程序运行结果,给出信号原始波形和信号滤波以后的波形,说明滤波的效果。

四、实验代码

程序代码如下:


其中滤波器的设计,信号的生成以及波形及频谱图的生成均借用 Matlab 完成


#include <math.h>#include <stdlib.h> #define Length 1024#define pi 3.1415926int fs=4096;  //采样频率int f1=100;    //信号频率int f2=200;    //噪声频率#define w1 2*pi*f1/fs  //信号角频率#define w2 2*pi*f2/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]=1024*sin(w1*i)+1024*sin(w2*i); //待滤波信号,乘以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 解读,项目源码,面经总结。

发布于: 刚刚阅读数: 4
用户头像

timerring

关注

公众号【AIShareLab】 2022-07-14 加入

公众号【AIShareLab】

评论

发布
暂无评论
嵌入式ARM设计编程(五) 实现信号的FIR滤波操作_arm_timerring_InfoQ写作社区