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:简单介绍下Ajax「建议收藏」

    中级JAVA:简单介绍下Ajax「建议收藏」首先Ajax是AsynchronousJavaScriptandXML的全称,Asynchronous是异步的意思,这跟传统的web不同。什么是同步什么是异步?同步是发送方发送数据之后,必须等接收方接收数据做出回应之后,才可以进行下一步。异步则是发送方发送数据之后不需等接收方做出回应,可以进行下一步操作。.

    2022年8月26日
  • SQL%NOTFOUND_oracle导出sql文件

    SQL%NOTFOUND_oracle导出sql文件SQL%NOTFOUND是一个布尔值。与最近的sql语句(update,insert,delete,select)发生交互,当最近的一条sql语句没有涉及任何行的时候,则返回true。否则返回fal

    2022年8月4日
  • css3实现进度条的模拟

    css3实现进度条的模拟

    2021年8月28日
  • pycharm各个版本有什么不同_pycharm更新python版本

    pycharm各个版本有什么不同_pycharm更新python版本pycharm怎么切换不同版本的pyhton打开pycharm,依次点击File-Settings,如图点击Project:PycharmProject-PyhtonInterpreter(这里的文件解释器,因各人的文件名不同而变化,不一定就是图中的文件名),如图点击设置键和弹出的Add,如图选择ExistingEnvironment,在右侧···选择所要配置的python的位置,如图也可以直接在搜索框粘贴所选的python的位置…

    2022年8月29日
  • c语言哈希表数据结构_c语言列表数据结构

    c语言哈希表数据结构_c语言列表数据结构简单的哈希表实现这是一个简单的哈希表的实现,用c语言做的。原理先说一下原理。先是有一个bucket数组,也就是所谓的桶。哈希表的特点就是数据与其在表中的位置存在相关性,也就是有关系的,通过数据应该可以计算出其位置。这个哈希表是用于存储一些键值对(key–value)关系的数据,其key也就是其在表中的索引,value是附带的数据。通过散列算法,将字符串的key映射到某个桶中,这个算法是确定的…

    2022年8月30日
  • pycharm导入cv2包_pycharm中cv2导入失败

    pycharm导入cv2包_pycharm中cv2导入失败最近才开始接触python,经师哥推荐,使用了Pycharm作为编程软件。自己在学图像处理方面的知识,接触OoenCV比较多,以前接触的是C++,使用VS2012进行编译,配置。学习的程序会有 importcv2 这条语句,我刚开始的想法是在File下面找到Deafaultsettings,再找到ProjectInterpreter,找到+,AvailablePackages,搜

    2022年8月25日

发表回复

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

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