数字滤波器C语言的模拟及验证

2024-06-29 AMPHENOL SENSORS 微信公众号
数字滤波器,传感器,AMPHENOL SENSORS 数字滤波器,传感器,AMPHENOL SENSORS 数字滤波器,传感器,AMPHENOL SENSORS 数字滤波器,传感器,AMPHENOL SENSORS

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


本文通过一个带通滤波器的Python验证,再转换到C++代码模拟验证的实现过程说明数字滤波器是如何工作的。


我们先通过Python测试验证,并生成滤波器的参数数据。然后将获取的参数用到C程序中重现滤波器。


先看图,后查代码。在测试中,我们生成了一个混有50Hz,110Hz和210Hz的模拟信号,然后通过滤波器保留50Hz的信号。

1718879006053055280.png

1718879006359082721.png1718879006188026398.png

相关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')
# Output coefficients, we got the coefficients 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) # Test signal

# 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++语言的功能复现和验证。

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


以下为滤波器的C++代码,大家可以再优化。直接上代码。

#include <stdio.h>
#include <iostream>
#include <vector>
#include <fstream>
#include <math.h>

#define SAMPLE_RATE 1000.0

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

const double pi = 3.14159265358979323846;

// 模拟信号函数
vector<double> generateSignal(int sampleRate, int seconds)
{
  vector<double>signal(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;
}

// 滤波器函数
vector<double> filter(const vector<double>& b, const vector<double>& a, const vector<double> &signal)
{
  vector<double> 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<double>& signal, const vector<double>& 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]<< "\n";
  }
}
// 主函数
int main()
{
  // 系数
  vector<double> 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<double> a{1};

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

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

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

  return 0;
}


从模拟到应用,我们的传感器会根据大家的需求不断演进。

授权代理商:世强先进(深圳)科技股份有限公司
技术资料,数据手册,3D模型库,原理图,PCB封装文件,选型指南来源平台:世强硬创平台www.sekorm.com
现货商城,价格查询,交期查询,订货,现货采购,在线购买,样品申请渠道:世强硬创平台电子商城www.sekorm.com/supply/
概念,方案,设计,选型,BOM优化,FAE技术支持,样品,加工定制,测试,量产供应服务提供:世强硬创平台www.sekorm.com
集成电路,电子元件,电子材料,电气自动化,电机,仪器全品类供应:世强硬创平台www.sekorm.com
  • +1 赞 0
  • 收藏
  • 评论 0

本文由赵优秀转载自AMPHENOL SENSORS 微信公众号,原文标题为:数字滤波器(3)——C语言的模拟及验证,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

评论

   |   

提交评论

全部评论(0

暂无评论

相关推荐

【经验】SGX传感器技术电化学气体传感器用电子电路的设计提供指导

本文为Amphenol Sensors旗下SGX传感器技术电化学气体传感器的电子电路设计提供指导。

2019-09-21 -  设计经验 代理服务 技术支持 批量订货

数字滤波器(6)—FIR频域连续滤波“重叠相加法”C++源码

传感器和信号处理仅一线之隔,信号的前后端合理搭配,是我们更准确地感知这个世界的一种基本态度和方式。FIR频域重叠相加法还记得我们(此处有重复之嫌)之前的发文《FIR连续采样分段卷积时域重叠相加法》?不过那是在时域处理的模拟和仿真。这次我们的内容是用C++在频域实现的滤波卷积法,仍然是重叠相加法,届时大家可以比较一下两种方式的差异。基本是通过两个处理过程。

2024-07-03 -  设计经验 代理服务 技术支持 批量订货

流量传感器(2)超声流量传感器—相位差和信号相关性原理

之前我们简单介绍了基于差压的流量传感器,这次我们要开始基于超声的流量计。超声流量计是一种测量液体或气体流量的仪器,其工作原理基于超声波在介质中传播的特性。这种流量计可以在无需接触或干扰流体本身的情况下进行测量,因此被广泛应用于各种工业环境,尤其是在需要无接触或无损测量的场合。

2024-06-18 -  设计经验 代理服务 技术支持 批量订货

解析数字滤波器(1)——陷波滤波器

有鉴于数字信号处理涉及的面太多,我们必须要把话题收缩。数字滤波的种类也是五花八门,因此再选一个小的类型,AMPHENOL SENSORS将围绕离散线性时不变系统来简单讨论一下陷波滤波器(Notch Filter)和梳状滤波器(Comb Filter),通过代码的演示和输出,我们可以比较一下这两类滤波器的特点。在本文中先以陷波滤波器为题来讨论相关的内容。

2024-07-25 -  技术探讨 代理服务 技术支持 批量订货

解析数字滤波器(2)——梳状滤波器及相关话题

本文AMPHENOL SENSORS将围绕但不限于梳状滤波器进行展开。其中,梳状滤波器,一方面可以滤除特定的频率(尤其是特定频率的谐波),另一方面也可以在信号中对指定频率及其倍频的信号进行拣选。例如图-1所示的滤除指定谐波成分的梳状滤波器的幅频图。

2024-07-25 -  技术探讨 代理服务 技术支持 批量订货

空气质量传感器定制

安费诺可定制CO2传感器、颗粒物传感器、温湿度传感器、灰尘(PM2.5和PM10)、相对湿度(RH)传感器的测量范围和输出形式、外形尺寸等其他个性化参数和传感器组合,拥有超过35项专利,包括在传感器使用寿命期限内保证其精度的ABC Logic专利。

服务提供商  -  AMPHENOL SENSORS TELAIRE 进入

Amphenol Sensors(安费诺)/All Sensors 压力传感器选型指南(简版)

目录- 传感器解决方案及产品优势介绍    传感器技术介绍    单芯片压力传感器    双芯电路交叉耦合补偿压力传感器    双芯电路和气路交叉耦合补偿压力传感器    传感器应用领域介绍    压力单位换算    传感器通用名词解释   

型号- DLH,ADCX,ACPC-C,AXCA,ACPC,BLV,DLV,ACPC-H,AXCA-PRIME,AXCA-MIDDLE,MAMP,MLV,SAMP,ACPC-P,BLC,ADUX,BLVR,MAMP-/P,ADCA,DLH,DLVR,DLVR,BLCR,MAMP-P,MDCX,ADO,BLV,AXCX-PRIME-INCH,DLHR,DLHR,AXCX,MLV,AXCA-MIL,BLC,DLC,ADO-MIL

AMPHENOL SENSORS  - 选型指南 代理服务 技术支持 批量订货

温度传感器定制

可定制温度范围-230℃~1150℃、精度可达±0.1°C;支持NTC传感器、PTC传感器、数字式温度传感器、热电堆温度传感器的额定量程和输出/外形尺寸/工作温度范围等参数定制。

服务提供商  -  AMPHENOL SENSORS THERMOMETRICS 进入

压力传感器定制

可定制板装式压力传感器支持产品量程从5inch水柱到100 psi气压;数字输出压力传感器压力范围0.5~60inH2O,温度补偿范围-20~85ºС;模拟和数字低压传感器可以直接与微控制器通信,具备多种小型SIP和DIP封装可选择。

服务提供商  -  AMPHENOL SENSORS 进入

Amphenol Sensors(安费诺) 汽车传感器选型指南

目录- 汽车传感器解决方案介绍    车厢空气质量系列传感器    排放处理系列传感器    新能源汽车传感器应用    测量汽车应用中最为关键的参数   

型号- SM-UART-01L,PT200,T6703,TPMS,DPS,G-CAP2,SM-UART-01D,A2103,NPI-19,T6713,A-2102,EGR,A-2103,NPP-301,GE-1935,A-2121,ZTP,DPF,SM-UART-01L+,SM-PWM-01C,NPX1

AMPHENOL SENSORS  - 选型指南 代理服务 技术支持 批量订货

气体传感器定制

安费诺可定制红外传感器、电化学传感器、半导体传感器、催化燃烧传感器、热导传感器及微型传感头、固定气体探测头等100多种型号传感器,支持检测NH3、CO、NO2、CO2、乙烯、丙烷、甲烷、苯、乙炔、HCVOCCH4及可燃气体等。

服务提供商  -  AMPHENOL SENSORS SGX SENSORTECH 进入

Amphenol Sensors(安费诺)/Nova Sensor 压力传感器及敏感元件选型指南

目录- P1300低压硅压力传感器芯片    P1302低压硅压力传感器芯片    P111中压硅压力传感器芯片    P883(5~15000 PSI)硅压力传感器芯片    P1602硅压力传感器芯片    P122 高压硅压力传感器芯片    NPC-100系列一次性医疗压力传感器    NPC-1210系列低压系列固态压力传感器    NPC-1220系列中压传感器    NPH系列固态压力传感器(中低压)    NPI-12卫生型压力传感器、不锈钢介质隔离压力传感器    NPI-15VC系列电压激励、高压、介质隔离压力传感器    NPI-15系列电流激励高压、介质隔离压力传感器    NPI-19系列电压激励、中压、介质隔离压力传感器    NPI-19系列电流激励、中压、介质隔离压力传感器    NPI-19低压不锈钢介质隔离压力传感器    NPP-301系列贴片封装压力传感器    NPA贴片式压力传感器    NPR-101系列复杂介质压力传感器    Modus T系列微差压力传感器    压力变送器IPT1000/2000系列   

型号- NPP-301B-700AT,IPT1000,51243,51245,51003,51244,NPP-301A-100AT,51005,51367,51004,51007,51006,51009,NPI-19X-YYYZZ,51008,51407,51406,NPI-15X-YYYZZ,51409,51408,NPP-301A-200A,NPH-XYYY-ZZ,51010,51012,51254,51011,51253,51013,NPA-300,NPR-101,51137,NPA-700,NPH系列,NPP-301B-200A,NPI-12,NPI-19X-XXXXV,P1602,NPI-15,NPP-301B-200AT,NPI-19,NPA100,NPI-15X-XXXXX,51142,MODUS T,51421,NPI-15X-XXXXXX,51304,51303,NPI-15C-C00903,NPP-301B-700A,51391,NPC-1210XXXX-YZ,51151,51393,51392,51395,NPI-19A-031GH,T10,51394,51031,51397,51399,51313,51433,51314,NPC-100T,51317,51318,NPP-301A-100A,P1302,NPC-100,P1300,51041,51283,NPI-19A-021GH,51282,T20,51045,51322,51046,51445,51324,51444,51323,51326,51325,51328,51327,51329,NPI-19A-002GV,NPI-15VC,NPP-301A-200AT,IPT2000,T30,NPC-1220XXXX-YZ,51298,51331,NPA-500,51330,51333,51299,51332,51335,51334,NPI-19X-XXXXXV,51337,51336,51339,51338,NPP-301B-100A,NPP-301B-100AT,NPA,T系列,P122,P883,NPH,NPI-19A-C01841,NPI-19A-C01840,NPP-301A-700A,T40,51340,NPP-301,51342,51187,51341,NPI-12-101GH,NPI-1,NPC-1220,NPP-301A-700AT,P111,51076,NPC-1210,51114

2018年1月  - AMPHENOL SENSORS  - 选型指南 代理服务 技术支持 批量订货

Wilcoxon 振动传感器产品

描述- 本资料介绍了Amphenol Sensors提供的多种振动监测传感器产品,包括安装在旋转设备轴承箱上的振动传感器、加速度传感器、速度传感器和双输出传感器等。涵盖了不同型号的产品特性,如灵敏度、频率响应范围、共振频率、电器噪音、最高工作温度等参数,并提供相应的应用场景和建议。此外,还介绍了4-20mA变送器和智能振动信号传输模块等产品,旨在为用户提供全面的振动监测解决方案。

型号- 787T,LPA100T,786LF,PC420A,PCC421A,787A,731A,PC420DPP-40,797T-1,793V-5,PC420V,PCC420V,893V,793T-3,786T,IT300,IT301,780B,780A,780C,799LF,PCC420A,786LF-500,786A,797V,731P31,LPA100T-D2,787-500,793V,PCC421V

2023/11/9  - AMPHENOL SENSORS  - 商品及供应商介绍 代理服务 技术支持 批量订货

代理传感器顶尖品牌:TE、安费诺、IDT、迈来芯、ROHM、可天士、SMI等15家

为满足工程师在研发过程中对不同品类产品的需求,世强元件电商不断为客户引进顶级的品牌、多样的产品品类。截至目前,平台授权代理的传感器品牌已有15家。平台VIP用户可免费获取来自原厂的最新产品和技术资讯、官方资料库,以低于行业的价格,购买原厂最新元器件和零件产品,享受供货保障。

2020-01-08 -  公司动态

安费诺先进传感器的MEMS传感器提供最先进的高性能、高性价比的传感器解决方案

NovaSensor(Amphenol Advanced Sensors的子品牌)的MEMS传感器其准确度、可靠性和尺寸大小而闻名于世,NovaSensor的传感器在医疗、运输和工业等领域的应用中提供最佳性能解决方案。

2019-08-08 -  原厂动态
展开更多

电子商城

查看更多

品牌:AMPHENOL SENSORS

品类:Air Quality Sensors

价格:¥119.7800

现货: 5,396

品牌:AMPHENOL SENSORS

品类:温度传感器

价格:¥14.2400

现货: 2,500

品牌:AMPHENOL SENSORS

品类:Assembly NTC temperature sensor

价格:¥5.0624

现货: 2,000

品牌:AMPHENOL SENSORS

品类:Surface Mount Pressure Sensors

价格:¥97.5000

现货: 51

品牌:AMPHENOL SENSORS

品类:Air Quality Sensors IR LED Dust Sensor

价格:¥40.5000

现货: 35

品牌:AMPHENOL SENSORS

品类:Board Mount Pressure Sensors

价格:¥253.8839

现货: 30

品牌:AMPHENOL SENSORS

品类:Low Pressure Compact Sensors

价格:¥125.9778

现货: 25

品牌:AMPHENOL SENSORS

品类:Board Mount Pressure Sensors

价格:¥253.8839

现货: 25

品牌:AMPHENOL SENSORS

品类:Board Mount Pressure Sensors

价格:¥227.5314

现货: 25

品牌:AMPHENOL SENSORS

品类:Board Mount Pressure Sensors

价格:¥227.5314

现货: 25

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

现货市场

查看更多

品牌:MELEXIS

品类:传感器

价格:¥7.5113

现货:324,452

品牌:SILICON LABS

品类:Switch Hall Effect Magnetic Position Sensor

价格:¥2.2924

现货:126,000

品牌:TI

品类:IC

价格:¥2.3459

现货:60,000

品牌:格科微

品类:图像传感器

价格:¥11.5588

现货:60,000

品牌:MELEXIS

品类:Position Sensors

价格:¥3.8658

现货:54,556

品牌:ONSEMI

品类:图像传感器

价格:¥55.5000

现货:43,751

品牌:TI

品类:测温芯片

价格:¥3.5400

现货:37,567

品牌:SILICON LABS

品类:Light Sensor

价格:¥20.3400

现货:28,003

品牌:Advanced Monolithic Systems

品类:磁场传感器

价格:¥24.6400

现货:20,000

品牌:纳芯微电子

品类:Analog Sensor Conditioner

价格:¥2.8600

现货:17,336

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

品牌:

品类:

价格:

现货:

服务

查看更多

铲齿/铝挤散热器定制

支持铲齿散热器鳍片最大加工厚度0.1-10mm,最大宽度600mm,铝挤散热器鳍片最小铝挤厚度5mm,最小鳍片间距1cm;定制散热器产品工艺有热管焊接,穿片,打磨,铲齿,铝挤及CNC加工修边飞面等。

最小起订量: 2pcs 提交需求>

VC散热器定制

可定制均温板VC最薄0.4mm,有效导热系数超5,000 W / m·K(纯铜(401 W/m·K ,石墨烯1,200 W/m·K)。工作温度范围同时满足低于-250℃和高于2000℃的应用,定制最低要求,项目年采购额大于10万人民币,或采购台套数大于2000套。

提交需求>

查看更多

授权代理品牌:接插件及结构件

查看更多

授权代理品牌:部件、组件及配件

查看更多

授权代理品牌:电源及模块

查看更多

授权代理品牌:电子材料

查看更多

授权代理品牌:仪器仪表及测试配组件

查看更多

授权代理品牌:电工工具及材料

查看更多

授权代理品牌:机械电子元件

查看更多

授权代理品牌:加工与定制

世强和原厂的技术专家将在一个工作日内解答,帮助您快速完成研发及采购。
我要提问

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

研发客服
商务客服
服务热线

联系我们

954668/400-830-1766(工作日 9:00-18:00)

service@sekorm.com

投诉与建议

E-mail:claim@sekorm.com

商务合作

E-mail:contact@sekorm.com

收藏
收藏当前页面