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

数据市
• 阅读 661
文章和代码已归档至【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.1415926
int 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;

输入信号波形图如下:

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

输入信号频谱图如下:

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

输出信号波形图如下:

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

输出信号频谱图如下:

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


欢迎关注公众号【AIShareLab】,一起交流更多相关知识,前沿算法,Paper解读,项目源码,面经总结。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Irene181 Irene181
4年前
60行Python代码开发在线markdown编辑器
本文转载自公众号【python大数据分析】,详情可以点击上方卡片,关注该公众号,获取更多好文推荐。❝本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes❞1简介这是我的系列教程「PythonDash快速web应用开发」的第六期,在上一期的文章中,我们完成了对
山东彭于晏 山东彭于晏
4年前
ARM架构简单认识
什么是ARM架构定义(来自百度百科)ARM架构,曾称进阶精简指令集机器(AdvancedRISCMachine)更早称作AcornRISCMachine,是一个32位精简指令集(RISC)处理器架构。还有基于ARM设计的派生产品,重要产品包括Marvell的XScale架构和德州仪器的OMAP系列。对于ARM架构解释较好的博文参考博文1:参考博文2:
Stella981 Stella981
4年前
ARM MIPS PowerPC X86 四大常见处理架构比较
目录1、ARM(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fqidicloud.blog.csdn.net%2Farticle%2Fdetails%2F104992919%231%25E3%2580%2581ARM)1.1ARM历史(https://www.os
Wesley13 Wesley13
4年前
Oracle ADG究竟是否收费?
!(https://oscimg.oschina.net/oscnet/faaf5c218b3045fe9a38ffa00c48a996.png)前两天微信群中,有位朋友问了,OracleDatabaseStandardEdition11gR2标准版支持activedataguard么?可能平时
Stella981 Stella981
4年前
48 JS
1•历史对象:用以存储客户端最近访问的网址清单。格式:•history.属性history.方法(参数)<ahref"js9.jsp"单击</a<ahref""onclick"history.back();returnfalse;"返回</a注:一定要有returnfalse
Stella981 Stella981
4年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(
可莉 可莉
4年前
200的大额人民币即将面世?央行:Yes!
点击上方蓝字关注我们!(https://oscimg.oschina.net/oscnet/2a1c2ac00bf54458a78c48a6c2e547d5.png)点击上方“印象python”,选择“星标”公众号重磅干货,第一时间送达!!(