Canmv k230 案例4.1——FIR 滤波器(一)
1 生成一个信号
import array
import math
from ulab import numpy as np
import time
PI = 3.14159265358979323846264338327950288419716939937510
rx = [] # 空列表,用于储存生成的输入数据
def input_data(): # 输入列表,5种频率 10Hz 100Hz 400Hz 合成信号
for i in range(1000):
data0 = 10 * math.cos(1 * 2 * PI * i / 100)
data1 =10 * math.cos(10 * 2 * PI * i / 100)
data2 =0 * math.cos(20 * 2 * PI * i / 100)
data3 =0 * math.cos(30 * 2 * PI * i / 100)
data4 =1 * math.cos(40 * 2 * PI * i / 100)
rx.append(data0 + data1 + data2 + data3 + data4)
input_data()
data = np.array(rx,dtype=np.float)
print('输入 :',rx)
1)绘制信号
假定采样率为1kHz,1000点的数据FFT的分辨率为fs/N=1000/1000=1Hz/点
2)并分析频谱
除了FFT一个序列的直流分量外,三种谐波成分均已理论一致
2 设计FIR滤波器
采用MATLAB中设置如上图所示,导出FIR滤波器系数,长度为阶数+1
0.00213234868716711 0.0318386063424590 0.127481167764050 0.264264449913397 0.332658925764871 0.264264449913397 0.127481167764050 0.0318386063424590 0.00213234868716711
也可以采用MWORKS.Syslab工具箱需教育邮箱
生成的FIR系数相差很小
0.002132348687167138
0.03183860634245905
0.12748116776405022
0.26426444991339704
0.33265892576487105
0.26426444991339704
0.12748116776405022
0.03183860634245905
0.002132348687167138
3 FIR原理及测试结果
其中h(k)为滤波器系数,x(n-k),代表离散信号沿时间轴移动
可以看到这是实时的信号处理过程,对于生成的数据集,反转FIR的系数较为简单,而本次设计的FIR滤波器参数的系数对称,因此直接乘积即可,后面实时处理时会说明
# 滤波后信号
yy=[]
# 滤波器系数h
h=[0.00213234868716711,0.0318386063424590,0.127481167764050,0.264264449913397,0.332658925764871,0.264264449913397,0.127481167764050,0.0318386063424590,0.00213234868716711]
x=[0,0,0,0,0,0,0,0,0] # 循环的FIR处理数据 初始化
y=[0,0,0,0,0,0,0,0,0] # 输出的每项乘积,需要sum(y)计算滤波器的输出
# FIR
for i in range(1000-len(h)):
x=rx[0+i:8+i]
for i in range(8):
y[i]=h[i]*x[i]
yy.append((sum(y)))
print('FIR输出:',yy)
Canmv k230运行输出后信号及频谱(输出信号补0后做FFT)
高频信号消除,但低频信号幅值收到滤波器的幅度响应影响发生了变化,再次设计高通滤波器保留400Hz谐波,结果如下:
Canmv k230运行结果符合预期
至此,暂时告一段路,后续补充