C#中实现FIR带通滤波

5 篇文章 0 订阅

最近有一个需求,在C#中实现FIR滤波,网上查了些资料感觉FIR滤波使用的还算比较多,相关的原理也比较简单。参考下面在Python环境中实现FIR的博客,在C#的环境中实现了一遍。

https://blog.csdn.net/moge19/article/details/94495442(Python实现FIR带通滤波器)

下文中的工程下载链接:https://download.csdn.net/download/zhoudapeng01/12036955

一、FIR滤波器的设计,这里使用Matlab进行设计:

filterDesigner命令启动工具箱

设计FIR带通滤波,这里设计32阶,125-300赫兹,Hamming窗

输出设计的滤波器:这里面有3种不同的输出模式,你可以都输出看看,本质上都是同一个滤波器,只不过表现形式不同而已。

matlab中的滤波效果验证(使用的是第一个选项生成的脚本,这里保存为FilteDesign1):

第一列为时域数据,第二列为频域数据。

第一行为输入数据,第二行为FIR滤波器的结果,第三行为理想的滤波结果,图中可以看出滤波后的频谱和理想频谱还算接近,具体的效果需要根据实际情况调节阶数等滤波器的参数。

clc;clear;clf;close all 

t = 0:0.001:0.05;
%原始数据
y = 0.7*sin(2*pi*30*t) + 1.8*sin(2*pi*160*t) + 5.1*sin(2*pi*330*t) ;
fft_y = abs(fft(y));
subplot(3,2,1);
plot(y)
subplot(3,2,2);
plot(fft_y)

%FIR滤波结果125-300
H = filter(FilteDesign1,y);
% H = filter(FilteDesign1,H');
fft_H = abs(fft(H));
subplot(3,2,3);
plot(H)
subplot(3,2,4);
plot(fft_H)
%理想结果
yH = 1.8*sin(2*pi*160*t);
fft_yH = abs(fft(yH));
subplot(3,2,5);
plot(yH)
subplot(3,2,6);
plot(fft_yH)

二、FIR带通滤波的C#实现

y(n)=\sum_{0}^{N}h(i)x(i)

个人理解滤波器的原理就是一句话:频域的乘积就是时域的卷积。实现滤波器的本质就是实现卷积运算,我们可以在matlab中获取上面设计滤波器的系数,在保存滤波器的时候选择第三个,在matlab函数中就可以获取到滤波器的系数h(i)。

C#的实现代码,filterParameters为对应的滤波器参数,其中CalcFIR为计算的核心部分,其输入参数为输入信号,返回值为滤波后的信号。

using System;
using System.Collections.Generic;
using System.Text;

namespace AlgorithmCSharp.Filter
{
    class FilterFIR
    {
        public List<double> filterParameters { get; set; }

        public FilterFIR(List<double> parameters)
        {
            filterParameters = parameters;
        }

        public double[] CalcFIR(double[] dataSerial)
        {
            int length = dataSerial.Length;
            int order = filterParameters.Count;
            double[] FIRResult = new double[length];

            for(int i =0; i<length; i++)
            {
                double sum = 0;
                if(i<order)
                {
                    for(int j =0; j<i;j++)
                    {
                        sum += filterParameters[j] * dataSerial[i - j];
                    }
                }
                else
                {
                    for(int j=0; j<order; j++)
                    {
                        sum += filterParameters[j] * dataSerial[i - j];
                    }
                }
                FIRResult[i] = sum;
            }

            return FIRResult;
            
        }

    }
}

对应的资源下载地址: https://download.csdn.net/download/zhoudapeng01/12036955

 

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: FIR(Finite Impulse Response)数字滤波是一种常见的数字信号处理方法,它可以用于在给定频率范围内滤除或保留信号。 在Python,我们可以使用scipy库来实现FIR带通滤波。以下是一个简单的步骤: 1. 首先,我们需要导入要使用的库: ```python import numpy as np from scipy import signal import matplotlib.pyplot as plt ``` 2. 然后,我们可以定义带通滤波器的一些参数,如采样频率、截止频率等: ```python # 定义采样频率和截止频率 fs = 1000 # 采样频率 lowcut = 50 # 低频截止频率 highcut = 200 # 高频截止频率 ``` 3. 接下来,我们可以使用scipy库的`firwin`函数来设计FIR滤波器的系数。例如,我们可以创建一个51个点的带通滤波器: ```python # 设计FIR滤波器的系数 numtaps = 51 # 系数数目 taps = signal.firwin(numtaps, [lowcut, highcut], pass_zero=False, fs=fs) ``` 4. 接下来,我们可以使用这些系数来创建FIR滤波器对象: ```python # 创建FIR滤波器对象 fir_filter = signal.TransferFunction(taps) ``` 5. 最后,我们可以使用滤波器对象来处理信号。假设我们有一个输入信号`x`: ```python # 输入信号 x = np.random.randn(1000) # 使用FIR滤波器进行滤波 filtered_x = signal.lfilter(fir_filter.num, fir_filter.den, x) ``` 这样,我们就使用Python的scipy库实现FIR带通滤波。 需要注意的是,上述代码只是实现FIR滤波器的设计和应用,如果你想要将其应用于实际的信号处理任务,可能还需要对滤波后的信号进行后续处理和分析。 ### 回答2: fir带通滤波是一种数字信号处理技术,用于在频域去除或增强特定频率范围内的信号。Python提供了丰富的库和工具来实现fir带通滤波。 首先,需要明确滤波的需求,包括截止频率、通带增益、阻带衰减等参数。然后,可以使用Python的scipy库进行滤波器设计和滤波操作。 首先,我们需要导入所需的库: ```python import numpy as np import scipy.signal as signal import matplotlib.pyplot as plt ``` 接下来,确定滤波器的设计参数,包括采样频率、截止频率等。 ```python fs = 1000 # 采样频率 nyquist = 0.5 * fs # 奈奎斯特频率,即采样频率的一半 lowcut = 20 # 滤波器的下限频率 highcut = 200 # 滤波器的上限频率 ``` 然后,使用scipy库firwin函数设计一个带通滤波器。 ```python numtaps = 100 # 滤波器的阶数 b = signal.firwin(numtaps, [lowcut, highcut], nyq=nyquist, pass_zero=False) ``` 接下来,可以使用signal库的lfilter函数对信号进行滤波。 ```python # 生成一个测试信号,包含频率为60Hz和150Hz的信号 t = np.linspace(0, 1, fs, endpoint=False) x = np.sin(2 * np.pi * 60 * t) + np.sin(2 * np.pi * 150 * t) # 对信号进行滤波 y = signal.lfilter(b, 1, x) ``` 最后,可以使用matplotlib库绘制原始信号和滤波后的信号进行对比。 ```python # 绘制原始信号和滤波后的信号 plt.figure(figsize=(10, 6)) plt.plot(t, x, label='Original Signal') plt.plot(t, y, label='Filtered Signal') plt.xlabel('Time [s]') plt.ylabel('Amplitude') plt.legend() plt.show() ``` 通过以上步骤,我们就可以使用Python实现fir带通滤波,将指定频率范围内的信号进行滤除或增强。 ### 回答3: FIR带通滤波器是一种数字滤波器,用于增强或减弱特定频率范围内的信号。Python通过scipy库firwin函数和lfilter函数可以很方便地实现FIR带通滤波。 首先,我们需要确定带通滤波器的参数,包括采样率、截止频率和通带宽度。然后,使用firwin函数生成滤波器的系数。 接下来,我们可以使用lfilter函数将滤波器系数应用于输入信号,得到滤波后的输出信号。 下面是一个简单的示例代码,实现了一个FIR带通滤波器: ```python import numpy as np from scipy.signal import firwin, lfilter def fir_bandpass_filter(signal, sample_rate, lowcut, highcut, width): # 计算滤波器的阶数 order = int(4 * sample_rate / width) # 生成滤波器系数 b = firwin(order, [lowcut, highcut], pass_zero=False, fs=sample_rate) # 应用滤波器 filtered_signal = lfilter(b, 1, signal) return filtered_signal # 示例用法 sample_rate = 1000 # 采样率 lowcut = 50 # 截止频率低边界 highcut = 200 # 截止频率高边界 width = 100 # 通带宽度 # 生成输入信号,以正弦波为例 time = np.arange(0, 1, 1/sample_rate) signal = np.sin(2*np.pi*100*time) + np.sin(2*np.pi*300*time) + np.sin(2*np.pi*500*time) # 应用带通滤波器 filtered_signal = fir_bandpass_filter(signal, sample_rate, lowcut, highcut, width) # 输出滤波后的信号 print(filtered_signal) ``` 在这个例子,我们生成了一个含有三个频率分量的信号,然后使用带通滤波器滤波,将截止频率为50Hz到200Hz之间,宽度为100Hz的频段提取出来。 这样,我们就可以用Python实现FIR带通滤波器了。希望对你有帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值