python fir滤波器_带通带阻滤波器切换

python fir滤波器_带通带阻滤波器切换1、FIR算法实现y(0)=∑0Nh(i)x(i)y(0)=\sum_{0}^Nh(i)x(i)y(0)=∑0N​h(i)x(i)classfilter:def__init__(self,order,h):self.order=orderself.h=hself.output=[]defFIR_Filter(se…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

1、FIR算法实现

y ( 0 ) = ∑ 0 N h ( i ) x ( i ) y(0)=\sum _{0}^Nh(i)x(i) y(0)=∑0N​h(i)x(i)

class filter:
    def __init__(self,order,h):
        self.order=order
        self.h=h
        self.output=[]
    def FIR_Filter(self,vi):
        for i in range(len(vi)):
            sum=0
            if i < self.order:
                for j in range(i):
                    sum=sum + self.h[j]*vi[i-j]
            else:      
                for j in range(self.order):
                    sum=sum + self.h[j]*vi[i-j]
                
            self.output.append(sum)   
        return self.output
        
       

IIR滤波算法可访问该博文:
Python 实现巴特沃斯滤波器

2、利用fdatool生成带通滤波参数

也可以自行计算,详见博文:FIR 带通滤波器参数设计流程
在这里插入图片描述

Weight=[ -0.001509991125, 0.001329824561, 0.005089743994,0.0004591136531,-0.003339873627,
   0.002003055066, -0.01155735459, -0.02634175681,  0.01259854902,    0.036990989,
   0.001854708185,  0.03572623804,  0.06532743573,  -0.1264344603,  -0.2432653308,
    0.07677905262,   0.3491531909,  0.07677905262,  -0.2432653308,  -0.1264344603,
    0.06532743573,  0.03572623804, 0.001854708185,    0.036990989,  0.01259854902,
   -0.02634175681, -0.01155735459, 0.002003055066,-0.003339873627,0.0004591136531,
   0.005089743994, 0.001329824561]

2.1 生成数据源

x=np.linspace(0,1,1200)
#设置需要采样的信号,频率分量有50,150和500
y=np.sin(2*np.pi*50*x) + np.sin(2*np.pi*150*x)+np.sin(2*np.pi*500*x)

利用FIR滤波:

FIR_filter=filter(32,Weight)
output = FIR_filter.FIR_Filter(y)

利用FFT分析比较:

分析源信号:

yy=fft(y)                     #快速傅里叶变换
yf=abs(fft(y))                # 取模
yf1=abs(fft(y))/((len(x)/2))           #归一化处理
yf2 = yf1[range(int(len(x)/2))]  #由于对称性,只取一半区间
plt.figure(1)
plt.plot(xf,yf1,'r') #显示原始信号的FFT模值

在这里插入图片描述
分析FIR滤波后的数据:

yy_1=fft(output)                     #快速傅里叶变换
yf_1=abs(fft(output))                # 取模
yf1_1=abs(fft(output))/((len(x)/2))           #归一化处理
yf2_1 = yf1_1[range(int(len(x)/2))]  #由于对称性,只取一半区间
plt.plot(xf,yf1_1,'r') #显示原始信号的FFT模值

在这里插入图片描述滤波后的信号与原数据比较:
在这里插入图片描述参考源码:

Weight=[ -0.001509991125, 0.001329824561, 0.005089743994,0.0004591136531,-0.003339873627,
   0.002003055066, -0.01155735459, -0.02634175681,  0.01259854902,    0.036990989,
   0.001854708185,  0.03572623804,  0.06532743573,  -0.1264344603,  -0.2432653308,
    0.07677905262,   0.3491531909,  0.07677905262,  -0.2432653308,  -0.1264344603,
    0.06532743573,  0.03572623804, 0.001854708185,    0.036990989,  0.01259854902,
   -0.02634175681, -0.01155735459, 0.002003055066,-0.003339873627,0.0004591136531,
   0.005089743994, 0.001329824561]
class filter:
    def __init__(self,order,h):
        self.order=order
        self.h=h
        self.output=[]
    def FIR_Filter(self,vi):
        for i in range(len(vi)):
            sum=0
            if i < self.order:
                for j in range(i):
                    sum=sum + self.h[j]*vi[i-j]
            else:      
                for j in range(self.order):
                    sum=sum + self.h[j]*vi[i-j]
                
            self.output.append(sum)   
        return self.output
        

#采样点选择1400个,因为设置的信号频率分量最高为600Hz,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400Hz(即一秒内有1400个采样点)
x=np.linspace(0,1,1200)
#设置需要采样的信号,频率分量有180,390和600
y=np.sin(2*np.pi*50*x) + np.sin(2*np.pi*150*x)+np.sin(2*np.pi*500*x)
yc=np.sin(2*np.pi*150*x)
yy=fft(y)                     #快速傅里叶变换
yf=abs(fft(y))                # 取模
yf1=abs(fft(y))/((len(x)/2))           #归一化处理
yf2 = yf1[range(int(len(x)/2))]  #由于对称性,只取一半区间
plt.figure(1)
plt.plot(xf,yf1,'r') #显示原始信号的FFT模值

#混合波的FFT(双边频率范围)
xf = np.arange(len(y))        # 频率
FIR_filter=filter(32,Weight)
output = FIR_filter.FIR_Filter(y)

yy_1=fft(output)                     #快速傅里叶变换
yf_1=abs(fft(output))                # 取模
yf1_1=abs(fft(output))/((len(x)/2))           #归一化处理
yf2_1 = yf1_1[range(int(len(x)/2))]  #由于对称性,只取一半区间

plt.figure(2)
plt.plot(y[0:50],'r') #显示原始信号的FFT模值
plt.plot(output[0:50],'b') #显示原始信号的FFT模值
#plt.plot(yc[0:50],'y') #显示原始信号的FFT模值
plt.figure(3)
#plt.plot(xf,yf1,'b') #显示原始信号的FFT模值
plt.plot(xf,yf1_1,'r') #显示原始信号的FFT模值
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197437.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Java中&0xFF是什么意思?计算机的原码、补码和反码

    Java中&0xFF是什么意思?计算机的原码、补码和反码公司项目中有向MCU发数据的代码,新来的同事对其中的&0xFF很不理解,我解释了很多遍他还是蒙圈状态,可能我的表达能力太差,想想还是用一篇博客来详细说明吧,代码如下:更新:07月10日,有个小伙伴对这种操作各种不习惯,怎么解释他都想不明白,所以增加了代码注释为什么要加上“&0xFF”?拆分理解下0xFF是16进制的表达方式,F是15;十进制为:255,二进制为:11111111

    2022年6月19日
  • android activity自动跳转,Android activity跳转之finish()方法的作用

    android activity自动跳转,Android activity跳转之finish()方法的作用最近在看郭神的《第一行代码(第2版)》,温故知新,看到有很多地方在页面跳转后还加了一句:finish();,原来像下面代码这样用Intent从Aactivity跳到Bactivity:Intentintent=newIntent(A.this,B.class);startActivity(intent);当成功跳到Bactivity的时候再点击返回键,就再次返回到了…

    2022年5月17日
  • java常见面试题及答案 11-20(JVM)

    11.JVM内存分哪几个区,每个区的作用是什么?java虚拟机主要分为以下一个区:方法区:1.有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载2.方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。3.该区域是被线程共享的。4.方法区里有

    2022年4月13日
  • ArcGIS二次开发基础教程(06):有关图层的基本操作

    ArcGIS二次开发基础教程(06):有关图层的基本操作ArcGIS二次开发基础教程(06):有关图层的基本操作0.PageLayout和MapControl的同步voidCopyToPage(){//对象拷贝,把mapcontrol的地图拷贝重写到pagelayout里IObjectCopycopy=newObjectCopyClass();objectfromMap=a…

    2022年7月23日
  • maven配置多仓库镜像「建议收藏」

    maven配置多仓库镜像「建议收藏」问题场景:1、国内访问maven默认远程中央镜像特别慢2、用阿里的镜像替代远程中央镜像3、大部分jar包都可以在阿里镜像中找到,部分jar包在阿里镜像中没有,需要单独配置镜像我想达到的目标:在maven中配置一主一副两个镜像,大部分jar直接通过主镜像可以找到,部分特殊jar在主镜像中找不到时,自动去副镜像中寻找。我所处的阶段:修改了maven的全局配置文件settin…

    2022年5月28日
  • Ubuntu 安装rabbitvcs

    Ubuntu 安装rabbitvcssudoadd-apt-repositoryppa:rabbitvcs/ppa#会提示确认,直接按回车键sudoapt-getupdatesudoapt-getinstallrabbitvcs-corerabbitvcs-clirabbitvcs-thunarthunarx-pythonsudoapt-getinstallrabbitvcs-geditsud

    2022年7月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号