0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数字滤波器是如何工作的

安费诺传感器学堂 来源:安费诺传感器学堂 2024-06-13 10:09 次阅读

之前我们在说明数字滤波器的时候,多为Python来进行示例验证的。实际应用中,多为C/C++,无论是在嵌入式系统中,还是PC机上,尤其对于时间或者实时性要求比较严格的情况下,C/C++应该是我们的首选。

本文通过一个带通滤波器的Python验证,再转换到C++代码模拟验证的实现过程说明数字滤波器是如何工作的。 我们先通过Python测试验证,并生成滤波器的参数数据。然后将获取的参数用到C程序中重现滤波器。 先看图,后查代码。在测试中,我们生成了一个混有50Hz,110Hz和210Hz的模拟信号,然后通过滤波器保留50Hz的信号。

d0335a90-20af-11ef-91d2-92fbcf53809c.png

图-1 滤波器的幅频响应(50Hz窄带带通)

d03715c2-20af-11ef-91d2-92fbcf53809c.png

图-2 模拟信号的滤波前后

d04f2770-20af-11ef-91d2-92fbcf53809c.png

图-3 模拟信号滤波前后的频谱图

相关python代码:

import numpy as np
from scipy.signal import firwin, freqz, lfilter
import matplotlib.pyplot as plt


fs = 1000.0 # Sample frequency (Hz)
f0 = 50.0 # Frequency to be removed from signal (Hz)
Q = 30.0 # Quality factor
w0 = f0/(fs/2) # Normalized Frequency


# Design band-pass filter
b = firwin(81, [w0 - 0.02, w0 + 0.02], pass_zero=False, window='hamming')
#Outputcoefficients,wegotthecoefficients from this step
b_string = ', '.join(str(coef) for i, coef in enumerate(b))
print('{', b_string, '}')


# Generate frequency response
w, h = freqz(b, [1], worN=1024)


# Convert to Hz
freq = w * fs / (2 * np.pi)


# Plot filter response
plt.plot(freq, abs(h))
plt.title('Filter Frequency Response')
plt.xlabel('Frequency [Hz]')
plt.ylabel('Gain')
plt.grid(True)
plt.show()


# Create a test signal
t = np.arange(0, 1.0, 1/fs) # Time vector
signal=np.sin(2*np.pi*210*t)+np.sin(2*np.pi*50*t)+np.sin(2*np.pi*110*t)#Testsignal


# Apply filter to the test signal
filtered_signal = lfilter(b, [1], signal)


# Original signal & filtered signal
plt.figure(figsize=(12, 8))
plt.subplot(211)
plt.plot(t[:500], signal[:500], color='blue')
plt.title('Original Signal')
plt.xlabel('Time [s]')
plt.grid()


plt.subplot(212)
plt.plot(t[:500], filtered_signal[:500], color='red')
plt.title('Filtered Signal')
plt.xlabel('Time [s]')
plt.tight_layout()
plt.grid()
plt.show()


# Compute and plot the frequency spectrum of signals
N = len(signal)
T = 1/fs
xf = np.linspace(0.0, 1.0/(2.0*T), N//2) # Frequency vector


# Compute FFT of original and filtered signals
fft_signal = np.fft.fft(signal)
fft_filtered = np.fft.fft(filtered_signal)


# Plot FFT of original signal
plt.figure(figsize=(12, 8))
plt.subplot(211)
plt.plot(xf, 2.0/N * np.abs(fft_signal[0:N//2]), color='blue')
plt.title('Original Signal FFT')
plt.xlabel('Frequency [Hz]')
plt.grid()


# Plot FFT of filtered signal
plt.subplot(212)
plt.plot(xf, 2.0/N * np.abs(fft_filtered[0:N//2]), color='red')
plt.title('Filtered Signal FFT')
plt.xlabel('Frequency [Hz]')
plt.grid()
plt.tight_layout()


plt.show()

滤波器通过C++语言的功能复现和验证。

d0678aea-20af-11ef-91d2-92fbcf53809c.png

图-4 模拟信号经C++滤波器的前后波形(取部分,请对照图-2)

这里的测试过程中,模拟信号由代码直接生成,然后经滤波器处理后,将该模拟信号和经滤波之后的信号数据全部存到csv文件中。在csv文件中,我们可以再现数据滤波前后的变化。 以下为滤波器的C++代码,大家可以再优化。直接上代码。

#include 
#include 
#include 
#include 
#include 


#define SAMPLE_RATE 1000.0


using namespace std; // 声明使用std命名空间


const double pi = 3.14159265358979323846;


// 模拟信号函数
vector generateSignal(int sampleRate, int seconds)
{
  vectorsignal(sampleRate * seconds);   //定义模拟信号的数组长度
  for (unsigned int i = 0; i < (unsigned int)(sampleRate * seconds); ++i)
  {
    // 包含50Hz,110Hz和210Hz信号
    signal[i] = sin((2 * pi * i * 50) / sampleRate) + sin((2 * pi * i * 210) / sampleRate) + sin((2 * pi * i * 110) / sampleRate);
  }
  return signal;
}


// 滤波器函数
vectorfilter(constvector&b,constvector&a,constvector&signal)
{
  vector output(signal.size());
  for (size_t i = 0; i < signal.size(); ++i)
  {
    for (size_t j = 0; j < b.size(); ++j)
    {
      if (i >= j)
      {
        output[i] += b[j] * signal[i - j];
      }
    }
    for (size_t j = 1; j < a.size(); ++j)
    {
      if (i >= j)
      {
        output[i] -= a[j] * output[i - j];
      }
    }
    output[i] /= a[0];
  }
  return output;
}


// 写入文件函数
void writeToFile(const vector& signal, const vector& filtered_signal, const string &filename)
{
  ofstream file(filename);


  for (std::size_t i = 0; i < signal.size(); i++)
  {
    file << i/SAMPLE_RATE << ", " << signal[i] <<", "<< filtered_signal[i]<< "
";
  }
}
// 主函数
int main()
{
  // 系数
  vector b{0.0010175493084400998, 0.0010954624020866333, 0.001080635650435545, 0.0009293052645812359,
                   0.0005868808563577278, -8.138309855847798e-19, -0.0008644147524968251, -0.0019966389877814107,
                   -0.003323586744207458, -0.004696461345361978, -0.005892320462621699, -0.006633249964255378, 
                   -0.006623614506478284, -0.005601944833604465, -0.0034001773970723163, -7.334366341273803e-18, 
                   0.004425290874832446, 0.00949426225087417, 0.014634010415364655, 0.019132982942933127, 
                   0.022226796444847933, 0.023207550009729024, 0.021541722692400025, 0.01697833945185371, 
                   0.009628503914736117, -6.755395515820625e-18, -0.01102370844120733, -0.02226281209657117, 
                   -0.032372473621654914, -0.04001099412924139, -0.04402269970024527, -0.043609484958132556, 
                   -0.03846490807520255, -0.028848803480728435, -0.015588116829396594, -9.10410551538968e-18, 
                   0.016255406162706088, 0.031374390998733945, 0.04363491329762711, 0.051616779739690075, 
                   0.05438594145724075, 0.051616779739690075, 0.04363491329762711, 0.031374390998733945, 
                   0.016255406162706088, -9.10410551538968e-18, -0.015588116829396594, -0.028848803480728435, 
                   -0.03846490807520255, -0.043609484958132556, -0.04402269970024527, -0.0400109941292414, 
                   -0.032372473621654914, -0.022262812096571168, -0.01102370844120733, -6.755395515820627e-18, 
                   0.009628503914736117, 0.016978339451853702, 0.021541722692400025, 0.023207550009729034, 
                   0.022226796444847933, 0.01913298294293312, 0.014634010415364655, 0.009494262250874175, 
                   0.004425290874832446, -7.3343663412738e-18, -0.0034001773970723163, -0.005601944833604469, 
                   -0.006623614506478284, -0.006633249964255374, -0.005892320462621699, -0.00469646134536198, 
                   -0.003323586744207458, -0.001996638987781409, -0.0008644147524968251, -8.138309855847805e-19, 
                   0.0005868808563577278, 0.0009293052645812359, 0.001080635650435545, 0.0010954624020866333, 
                   0.0010175493084400998};
  vector a{1};


  // 生成模拟信号
  vector signal = generateSignal(1000, 1); // 1秒的模拟信号


  // 滤波处理
  vector output = filter(b, a, signal);


  // 写入至csv文件
  writeToFile(signal, output, "output.csv");


  return 0;
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数字滤波器
    +关注

    关注

    4

    文章

    270

    浏览量

    46997
  • C语言
    +关注

    关注

    180

    文章

    7602

    浏览量

    136357
  • C++
    C++
    +关注

    关注

    22

    文章

    2105

    浏览量

    73531
  • python
    +关注

    关注

    56

    文章

    4784

    浏览量

    84502

原文标题:数字滤波器(3)——C语言的模拟及验证

文章出处:【微信号:安费诺传感器学堂,微信公众号:安费诺传感器学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用FPGA构建的数字滤波器设计方案

    本文简要介绍了FIR数字滤波器的结构特点和基本原理,提出基于FPGA和DSP Builder的FIR数字滤波器的基本设计流程和实现方案。##FIR 数字滤波器的详细设计。
    发表于 07-24 15:30 8811次阅读
    使用FPGA构建的<b class='flag-5'>数字滤波器</b>设计方案

    中频滤波器数字滤波器

    通过数字滤波器可以获得很窄的带宽。和模拟滤波器相比,理想的高斯滤波器可以实 现。数字滤波器在可接受的价格内有更好的选择性,如5级电路模拟滤波器
    发表于 10-13 09:22

    数字滤波器的主要特点

    ://www.gooxian.com/product_detail-9722.htm的工作方式与模拟滤波器完全不同模拟滤波器完全依靠电阻、电容、晶体管等电子元件组成的物理网络实现滤波
    发表于 11-10 16:43

    数字滤波器的设计与应用

    数字滤波器
    发表于 08-26 19:29 24次下载
    <b class='flag-5'>数字滤波器</b>的设计与应用

    数字滤波器(DF)的基本结构

    数字滤波器的基本结构:数字滤波器结构的表示方法一. 数字滤波器的概念1.滤波器:指对输入信号起滤波作用的装置。2、当输入、输出是离散信号,
    发表于 12-07 12:10 14次下载

    数字滤波器的结构

    数字网络的信号流图表示 IIR数字滤波器的结构 FIR数字滤波器的结构数字滤波器的格形结构信号流图的基本概念1、定义:信号流图是一种有向图,它用带箭头
    发表于 01-07 10:24 30次下载

    数字滤波器的原理及其设计

    本章介绍数字滤波器的原理及其设计。数字滤波器的设计是数字系统综合的问题之一。所谓数字系统的综合(synthesis)就是给出设计指标的情况下,设计一个系统使之满足设计指标
    发表于 11-24 09:13 127次下载

    数字滤波器的设计实验

    数字滤波器的设计实验 一. 数字滤波器设计:(1) 数字滤波器设计步骤:a. 整理给定的滤波器设计要求
    发表于 10-30 13:34 5734次阅读
    <b class='flag-5'>数字滤波器</b>的设计实验

    什么是数字滤波器

    什么是数字滤波器 数字滤波器(digital filter)是由数字乘法器、加法器
    发表于 06-30 12:37 3975次阅读
    什么是<b class='flag-5'>数字滤波器</b>

    数字滤波器,数字滤波器原理是什么?

    数字滤波器,数字滤波器原理是什么? 在信号处理领域中,对于信号处理的实时性、快速性的要求越来越高。而在许多信息处理过程中
    发表于 03-24 14:06 2.9w次阅读

    24位96khz采样CMOS的立体声音频∑-Δ数位类比转换

    数字滤波器工作在8倍过采样在96kHz采样率,两种滚性能可以选择:夏普滚,或慢滚,如需要特定的应用。PCM1716适合中高档音响应用程序,如CD,DVD音频和音乐仪器,因为该设备具有优越的音频动态性能,24位分辨率及96kHz采样。 特征 增强多层次delta-sigma
    发表于 06-02 09:55 11次下载
    24位96khz采样CMOS的立体声音频∑-Δ数位类比转换<b class='flag-5'>器</b>

    数字滤波器的设计方法及步骤详解

    本文首先介绍了数字滤波器的原理,其次介绍了数字滤波器分类,最后介绍了五种不同数字滤波器的设计方法与步骤。
    发表于 04-20 10:40 12.9w次阅读
    <b class='flag-5'>数字滤波器</b>的设计方法及步骤详解

    基于matlab的数字滤波器的设计及数字滤波器基本结构

    本文主要介绍了基于matlab的数字滤波器的设计及数字滤波器基本结构。
    发表于 06-05 08:00 27次下载

    FIR数字滤波器设计

    数字滤波器的输入输出均为数字信号,信号通过数字滤波器后,可以改变频率成分的相对比例或滤除某些频率成分。数字滤波器可以分为IIR数字滤波器和F
    的头像 发表于 04-05 09:47 5596次阅读

    数字滤波器是什么 数字滤波器的性能指标

      数字滤波器的原理基于数字信号处理技术和滤波器算法,通过对离散时间信号进行处理和滤波,实现对信号频率的选择性衰减和增强。数字滤波器的输入信
    发表于 02-24 11:23 5328次阅读