学习一样东西,个人建议须从三个维度进行:what why how
这里的内容主要参考胡广书编写的《《数字信号处理导论》》7.5.1节,加了一些自己的理解。
提到平均滤波器,做过单片机应用开发的朋友,马上能想到将一些采样数据进行加和求平均。诚然如此,从其时域数学描述而言也很直观:
其中 代表当前测量值,对于单片机应用而言,可以是当前adc的采样值或者当前传感器经过一系列处理的物理量(比如在工业控制领域中的温度、压力、流量等测量值),而 表示上一次的测量值,以此类推, 则是前第n-1次测量值。
为了揭示其更深层次的机理,这里用z传递函数将上述公式进一步描述:
对于傅立叶变换而言:
z变换的本质是拉普拉斯变换的离散化形式, ,令 ,则
令 ,则
)
所以,平均滤波器的频率响应为:
幅频相频响应分析
利用下面的python代码,来分析一下
# encoding: utf-8
fromscipy.optimize importnewton
fromscipy.signal importfreqz, dimpulse, dstep
frommath importsin, cos, sqrt, pi
importnumpy asnp
importmatplotlib.pyplot asplt
importsys
reload(sys)
sys.setdefaultencoding( ‘utf8’)
#函数用于计算移动平均滤波器的截止频率
defget_filter_cutoff(n, **kwargs):
func = lambdaw: sin(n*w/ 2) - n/sqrt( 2) * sin(w/ 2)
deriv = lambdaw: cos(n*w/ 2) * n/ 2- n/sqrt( 2) * cos(w/ 2) / 2
omega_0 = pi/n # starting condition: halfway the first period of sin
returnnewton(func, omega_0, deriv, **kwargs)
#设置采样率
sample_rate = 200#hz
n = 7
# 计算截止频率
w_c = get_filter_cutoff(n)
cutoff_freq = w_c * sample_rate / ( 2* pi)
# 滤波器参数
b = np.ones(n)
a = np.array([n] + [ 0]*(n -1))
#频率响应
w, h = freqz(b, a, worn= 4096)
#转为频率
w *= sample_rate / ( 2* pi)
#绘制波特图
plt.subplot( 2, 1, 1)
plt.suptitle( “bode”)
#转换为分贝
plt.plot(w, 20* np.log10(abs(h)))
plt.ylabel( ‘magnitude [db]’)
plt.xlim( 0, sample_rate / 2)
plt.ylim( -60, 10)
plt.axvline(cutoff_freq, color= ‘red’)
plt.axhline( -3.01, linewidth= 0.8, color= ‘black’, linestyle= ‘:’)
# 相频响应
plt.subplot( 2, 1, 2)
plt.plot(w, 180* np.angle(h) / pi)
plt.xlabel( ‘frequency [hz]’)
plt.ylabel( ‘phase [°]’)
plt.xlim( 0, sample_rate / 2)
plt.ylim( -180, 90)
plt.yticks([ -180, -135, -90, -45, 0, 45, 90])
plt.axvline(cutoff_freq, color= ‘red’)
plt.show
取采样率为200hz,滤波器长度为7可得下面的幅频、相频响应曲线。从其主瓣可见其幅频响应为一低通滤波器。幅频响应略有不平,随频率上升而衰减。其相频响应线性。如果对滤波器有经验的朋友会知道fir滤波器的相频响应是线性的,而移动平均滤波器刚好是fir的一种特例。
当改变滤波器长度为3/7/21时,仅观察其幅频响应:
可见,随着滤波器的长度变长,其截止频率变小,其通带变窄。滤波器的响应变慢,延迟变大。所以实际使用的时候,须根据有用频率带宽合理选择滤波器的长度。有用信号的带宽可以通过按采样率采集一定的点进行傅立叶分析可得。如果有带fft功能的示波器,也可以直接测量得到。
c语言实现
滤波器的c语言实现,比较容易。干货在此,快快领走
# definemvf_length 5
typedeffloate_sample;
/*定义移动平均寄存器历史状态*/
typedefstruct_ t_maf
{
e_sample buffer[mvf_length];
e_sample sum;
intindex;
}t_maf;
voidmoving_average_filter_init(t_maf * pmaf)
{
pmaf-》index = -1;
pmaf-》sum = 0;
}
e_sample moving_average_filter(t_maf * pmaf,e_sample xn)
{
e_sample yn= 0;
inti= 0;
if(pmaf-》index == -1)
{
for(i = 0; i 《 mvf_length; i++)
{
pmaf-》buffer = xn;
}
pmaf-》sum = xn*mvf_length;
pmaf-》index = 0;
}
else
{
pmaf-》sum -= pmaf-》buffer[pmaf-》index];
pmaf-》buffer[pmaf-》index] = xn;
pmaf-》sum += xn;
pmaf-》index++;
if(pmaf-》index》=mvf_length)
pmaf-》index = 0;
}
yn = pmaf-》sum/mvf_length;
returnyn;
}
测试代码:
# definesample_rate 500.0f
# definesample_size 256
# definepi 3.415926f
intmain
{
e_sample rawsin[sample_size];
e_sample outsin[sample_size];
e_sample rawsquare[sample_size];
e_sample outsquare[sample_size];
t_maf mvf;
file *pfile=fopen( “。/simulationsin.csv”, “wt+”);
/*方波测试*/
if(pfile== null)
{
printf( “simulationsin.csv opened failed”);
return-1;
}
for( inti= 0;i《sample_size;i++)
{
rawsin = 100* sin( 2*pi* 20*i/sample_rate)+rand% 30;
}
/*正弦信号测试*/
for( inti= 0;i《sample_size/ 4;i++)
{
rawsquare = 5+rand% 10;
}
for( inti=sample_size/ 4;i《 3*sample_size/ 4;i++)
{
rawsquare = 100+rand% 10;
}
for( inti= 3*sample_size/ 4;i《sample_size;i++)
{
rawsquare = 5+rand% 10;
}
/*初始化*/
moving_average_filter_init(&mvf);
/*滤波*/
for( inti= 0;i《sample_size;i++)
{
outsin=moving_average_filter(&mvf,rawsin);
}
for( inti= 0;i《sample_size;i++)
{
fprintf(pfile, “%f,”,rawsin);
}
fprintf(pfile, “n”);
for( inti= 0;i《sample_size;i++)
{
fprintf(pfile, “%f,”,outsin);
}
fclose(pfile);
pfile=fopen( “。/simulationsquare.csv”, “wt+”);
if(pfile== null)
{
printf( “simulationsquare.csv opened failed”);
return-1;
}
/*初始化*/
moving_average_filter_init(&mvf);
/*滤波*/
for( inti= 0;i《sample_size;i++)
{
outsquare=moving_average_filter(&mvf,rawsquare);
}
for( inti= 0;i《sample_size;i++)
{
fprintf(pfile, “%f,”,rawsquare);
}
fprintf(pfile, “n”);
for( inti= 0;i《sample_size;i++)
{
fprintf(pfile, “%f,”,outsquare);
}
fclose(pfile);
return0;
}
对于方波测试,利用excel生成波形,可得如下的波形。从波形明显可见,长度为7的移动平均滤波器对于随机噪声的滤波效果比较满意。从图中还可以看出,移动平均滤波器在信号链中会引入一定的延时,在应用时需要考虑。对于一般的传感测量如果没有明确的要求,常常可以忽略。
对于正弦信号而言,移动平均滤波器也有比较明显的效果,只是其通带比较窄,如果有用信号频率比较高,则移动平均滤波器将不适合。
Android平板电脑三大生存法则
Linux学习书籍推荐Linux就该这么学
自驾车:车道保持系统工作原理及实例介绍
Maxim T1/E1/J1收发器的T1/E1环回操作
基于ElanSC520微控制器和Linux操作系统的ADSL网关研究
浅谈移动平均滤波器C实现设计
博世和潍柴在发动机技术上取得历史性突破
中国有哪些军用无人机_国内军用无人机排名
一体成型电感厂商揭秘一体成型贴片电感电流范围 gujing
凌科LP系列工业连接器为激光设备带来快速、可靠、高效的电气连接
虹科产品 | 基于事件的智能数据管理平台Heex
加入华为鸿蒙生态的完整大名单来了
8K已成未来主流 4K可能是假的
民用监控设备与公安监控设备并网共享提高应用效率
一文看懂国内传感器发展痛点及政策解读
四组团队利用NVIDIA加速计算和人工智能平台开展研究工作
iPad mini最新模型再次现身!7.85寸,Lightning接口
智能机器人时代哪些工作处于危险之中?
特斯拉更换便宜的18650锂电池,理由何在?
HoloLens更新将带来许多新功能和便利性改进