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


相关推荐

  • C++线程同步 CCRITICALSECTION(临界区类)附自己写的测试代码

    C++线程同步 CCRITICALSECTION(临界区类)附自己写的测试代码当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。CCriticalSection类的用法如下:定义CCriticalSection类的一个全局对象(以使各个线

    2022年7月20日
    16
  • 频谱分析仪知识_频谱分析仪

    频谱分析仪知识_频谱分析仪17年电赛的元器件清单下来了,基本仪器有频率特性测试仪,且13年国赛出现过,15年国赛也出现过频谱分析仪,知乎上有人猜测今年依然会出频域测量的题,这几天我就找了不少资料。了解了频谱分析仪和频率特性测试仪的原理。—————————————————————————————————————————————————————频谱分析仪     频谱分析仪主要用来分析信号中各频率成分。主要有多滤

    2022年8月11日
    5
  • java堆和栈的区别和联系_数据结构堆和栈的区别

    java堆和栈的区别和联系_数据结构堆和栈的区别1、概述在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。2、堆内存1.什么是堆内存?堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。2.堆内存的特点是什么?第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也

    2022年9月4日
    4
  • jQuery+CSS3文字跑马灯特效

    jQuery+CSS3文字跑马灯特效是一款将跑马灯背景制作为3D立方体效果,文字在上面移动时,就像是文字投影到墙壁上,在转角出会改变运动方向。效果展示 http://hovertree.co

    2021年12月27日
    37
  • win10恶意软件删除工具[通俗易懂]

    win10恶意软件删除工具[通俗易懂]win+r,输入mrt弹出操作界面点击下一步,根据需要进行扫描,扫描完成后根据情况进行处理

    2022年6月24日
    41
  • 2017年科技界十大新闻,你都知道吗?「建议收藏」

    2017年科技界十大新闻,你都知道吗?

    2022年3月12日
    39

发表回复

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

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