嵌入式 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.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;
复制代码
输入信号波形图如下:
输入信号频谱图如下:
输出信号波形图如下:
输出信号频谱图如下:
欢迎关注公众号【AIShareLab】,一起交流更多相关知识,前沿算法,Paper 解读,项目源码,面经总结。
划线
评论
复制
发布于: 刚刚阅读数: 4
版权声明: 本文为 InfoQ 作者【timerring】的原创文章。
原文链接:【http://xie.infoq.cn/article/fd613cb5d32fe7db4ed0ee9be】。未经作者许可,禁止转载。
timerring
关注
公众号【AIShareLab】 2022-07-14 加入
公众号【AIShareLab】
评论