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)=0Nh(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Apache Rewrite 详解RewriteCond「建议收藏」

    Apache Rewrite 详解RewriteCond「建议收藏」RewriteCond重写规则执行条件语法:RewriteCondTestStringCondPattern生效域:serverconfig,virtualhost,directory,.htaccess特别的上面的TestString,可提供反向引用.引用模式为:%N其中N为(0&lt;=N&lt;=9),引用当前若干Rewrit…

    2022年4月30日
    30
  • 缓存穿透,缓存击穿,缓存雪崩解决方案分析[通俗易懂]

    缓存穿透,缓存击穿,缓存雪崩解决方案分析[通俗易懂]前言设计一个缓存系统,不得不要考虑的问题就是:缓存穿透、缓存击穿与失效时的雪崩效应。缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案

    2022年6月30日
    18
  • java取余操作的坑

    java取余操作的坑%操作慎用!!!本人比赛时遇到的坑,简单的题但是时间超了publicstaticvoidmain(String[]args){//System.currentTimeMillis()//从1970年01月01日00时00分00秒000毫秒到此刻的毫秒数返回类型是long类型longtime=System.currentTimeMillis();inta=Integer.MAX_VALUE;for(inti=1;i&lt

    2022年6月7日
    49
  • nginx转发wss「建议收藏」

    nginx转发wss「建议收藏」nginx转发wss

    2022年10月18日
    0
  • Linux安装tomcat(超详细步骤)

    Linux安装tomcat(超详细步骤)1,安装前置条件安装Tomcat需要先安装jdk,没有安装jdk的,先移步到这里安装jdk,详见参考文章2,下载所需压缩包,上传到服务器官网下载地址:https://tomcat.apache.org/访问官网下载我这里选择Tomcat9,直接下载最新的发行版,这里下载二进制的核心板就行,不需要下载源码版本,选择tar.gz直接下载上传(上传位置随意,自己方便管理就行)3,对资源进行解压tar-zxvf压缩包名 //对压缩包进行解压4,给防火墙添加访问端口(

    2022年6月2日
    324
  • APACHE服务器出现No input file specified.的完美解决方案

    APACHE服务器出现No input file specified.的完美解决方案

    2021年10月9日
    69

发表回复

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

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