数字滤波器C语言的模拟及验证
之前我们在说明数字滤波器的时候,多为Python来进行示例验证的。实际应用中,多为C/C++,无论是在嵌入式系统中,还是PC机上,尤其对于时间或者实时性要求比较严格的情况下,C/C++应该是我们的首选。
本文通过一个带通滤波器的Python验证,再转换到C++代码模拟验证的实现过程说明数字滤波器是如何工作的。
我们先通过Python测试验证,并生成滤波器的参数数据。然后将获取的参数用到C程序中重现滤波器。
先看图,后查代码。在测试中,我们生成了一个混有50Hz,110Hz和210Hz的模拟信号,然后通过滤波器保留50Hz的信号。
相关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;
}
从模拟到应用,我们的传感器会根据大家的需求不断演进。
- |
- +1 赞 0
- 收藏
- 评论 0
本文由赵优秀转载自AMPHENOL SENSORS 微信公众号,原文标题为:数字滤波器(3)——C语言的模拟及验证,本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。
相关研发服务和供应服务
相关推荐
【经验】SGX传感器技术电化学气体传感器用电子电路的设计提供指导
本文为Amphenol Sensors旗下SGX传感器技术电化学气体传感器的电子电路设计提供指导。
设计经验 发布时间 : 2019-09-21
【经验】一文介绍清楚一次性有创性血压传感器的使用和特点、以及对压力传感的要求
笔者Amphenol Sensors的工程师,本文将对一次性有创性血压传感器的使用及特点,结合国内的医药行业对血压传感器的标准,做一个简单的性能指标上的解说。
设计经验 发布时间 : 2020-03-31
数字滤波器(6)—FIR频域连续滤波“重叠相加法”C++源码
传感器和信号处理仅一线之隔,信号的前后端合理搭配,是我们更准确地感知这个世界的一种基本态度和方式。FIR频域重叠相加法还记得我们(此处有重复之嫌)之前的发文《FIR连续采样分段卷积时域重叠相加法》?不过那是在时域处理的模拟和仿真。这次我们的内容是用C++在频域实现的滤波卷积法,仍然是重叠相加法,届时大家可以比较一下两种方式的差异。基本是通过两个处理过程。
设计经验 发布时间 : 2024-07-03
解析数字滤波器(1)——陷波滤波器
有鉴于数字信号处理涉及的面太多,我们必须要把话题收缩。数字滤波的种类也是五花八门,因此再选一个小的类型,AMPHENOL SENSORS将围绕离散线性时不变系统来简单讨论一下陷波滤波器(Notch Filter)和梳状滤波器(Comb Filter),通过代码的演示和输出,我们可以比较一下这两类滤波器的特点。在本文中先以陷波滤波器为题来讨论相关的内容。
技术探讨 发布时间 : 2024-07-25
Amphenol Sensors(安费诺)/Thermometrics 温度传感器选型指南
目录- 温度传感器产品介绍及应用领域 NTC热敏电阻/PTC热敏电阻 探针和组件 其他技术和附件
型号- T5D,HM,YA,YB,YC,P60,YD,YF,P65,YG,YH,RL40,YK,YL,YP,YR,EC95,GC32,YS,RL45,GC16,B35,UD20,RL30,3006,AB6,MELF,JA,YS4019,JB,JTC,JC,JD,RL35,JE,JF,MF65,SP85,JS2945,JI,B43,JL,JM,JP,FP10,JR,JTR,CTR100,FP14,P85,JW,M,NDK,T,NDM,CTR65,NDL,ZTP,BB07,PT1000,0706,BB05,NDP,YS4020,NDU,YSM 4021,CL,CTR85,BR16,KU,BR14,KY,BR11,TC,FP07,1403,NHQM,YSM,TH,R100,TM,MA400,PTSM,TP,1803,BB11,EVAP,P100,MA100,DK,SC30,R60,BR23,P20,R65,HVAC,P25,YM120,PT200,EVAPA1450,MS,DKM,MT,CTR60,P30,RL1004,BR32,A1447-A1450,ND,PTA,NK,EVAPA1447,1703,PTE,PTD,SP100,PTF,DC95,PTH,B05,B07,PTO,EVAP A1424,SC50,R85,BR42,C100,2006,JYA,NHQ,NHQMM,GC11,GC14,GE,RL20,M2000,B10,PT100,B14,GT,BR55,MC65,SP60,TK95,SP65,RL14,RL060628,RL10
Amphenol Sensors(安费诺)温度传感器/MEMS压力传感器/C〇2、湿度、灰尘传感器选型指南
目录- Sensors Temperature Sensors Pressure Sensors CO2, Humidity & Dust Sensors
型号- DK SERIES,NDP SERIES,NHQ SERIES,AAS-AQS-UNO-RH-CO2,RL40,T5D SERIES,FMA SERIES,GC32,EC95,AB6 SERIES,RL45,GC16,GT SERIES,DKM SERIES,CTP65,M SERIES,UD20,S SERIES,CTP60,RL30,AIT SERIES,GE-1935,TH SERIES,NDL SERIES,3006,MELF,YS4019,RL35,HM SERIES,GE-2102,GE-2103,JS2945,T6715,T6613-X,AAS-AQS-UNO,TM SERIES,R85 SERIES,SM-UART-04L,YSM SERIES,FP10,NPI-15,T6715-X,FP14,NPC-120,HS12SP,NPI-19,B35 SERIES,T6713,BB07,SUF SERIES,NK SERIES,BB05,YS4020,T6703,YSM 4021,YR SERIES,BR16,A-1737,BR14,T6700,BR11,T SERIES,FP07,1403,NHQM,P85 SERIES,ZTP SERIES,JF SERIES,NDK SERIES,JS8741,NPH SERIES,JS8746,R100,JR SERIES,PTSM,MA400,SM-PWM-01C,JB SERIES,1803,BB11,B05 SERIES,T6616,EVAP,YF SERIES,JA SERIES,P100,YD SERIES,YH SERIES,MF65 SERIES,YG SERIES,MA100,JIC SERIES,YB SERIES,B43 SERIES,T9602,NPC-100,YA SERIES,YC SERIES,SC30,CTP100,BR23,T6613,PTD SERIES,PTE SERIES,YM120,HVAC,JTC SERIES,JTR SERIES,MS SERIES,YK SERIES,WTF083B001,P30 SERIES,YL SERIES,YP SERIES,PTA SERIES,PTH SERIES,ND SERIES,B07 SERIES,PTF SERIES,PTO SERIES,P60 SERIES,JM SERIES,YS SERIES,T6600,RL1004,BR32,JS6780,JI SERIES,HS30P,JW SERIES,A1447-A1450,JS SERIES,TP SERIES,JE SERIES,JC SERIES,GE-1856,1703,B14 SERIES,T6615-X,GE SERIES,R65 SERIES,DC95,JYA SERIES,T3000,EVAP A1424,SC50,BR42,A-1266,C100,GE-1923,NPP-301,706 SERIES,2006,NKA SERIES,AS SERIES,B10 SERIES,P25 SERIES,NHQMM,GC11,RL20,CL SERIES,P20 SERIES,GC14,GE-1920,NPC-1220,JP SERIES,P65 SERIES,ES SERIES,CTP85,T6713-X SERIES,BR55,MC65,KU SERIES,TK95,NDM SERIES,R60 SERIES,NDU SERIES,NPC-1210,TC SERIES,JL SERIES,RL14,JD SERIES,RL060628,RL10
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(安费诺)建筑及工业应用传感器选型指南
目录- Chip Cap 2完全校准的温湿度传感器 Telaire Ventostat®T8700壁挂式温湿度变送器 Telaire Ventostat®T8031 CO2小型风管式C02传感器 Telaire®T8041/T8042 分管式C02传感器 Telaire T8100-R系列挂壁式C02和温度变送器(带继电器) Telaire®7000室内空气品质监测器 Telaire VaporstatTM 9002红外露点变送器 Telaire®配件 Telaire HumiTrac™温湿度变送器 T9602湿度与温度传感器 AAS-53系列水管型温度变送器 ADT/AOT/AIT温湿度变送器使用说明书
型号- P40250128,CC2D265,P40250129,P40250126,P40250127,P40250125,P40250122,P40250123,DC95F302W,P40250120,P40250121,T8031,CC2D255,EHR-4,T8100-D-R,P40250139,K53,T8700,CC2A23,PT1000A,AIT,PT1000B,CC2A25,P40250133,P40250131,T2075NG,P40250130,T804K0-10V,T1508,T8200-D-5P,T8042-5VI0-5V,T9602-5-A-1,NI1000,9002,T9602-3-A-1,T5100,P40250149,CC2A35,T8700-E-D,P40250147,0-5000PPM,P40250144,PT100A,T7001I,P40250145,PT100B,P40250142,P40250143,T8100,S4B-EH,CC2A33,P40250141,CC2D235,CC2D355,T7001,PT1000,T2072,T7001D,CC2D25,T9602-3-A,T8042I0-10V,CC2D23,P40250156,T8041,T8100-R,P40250151,T8042,P40250150,T9602-3-D,NTC10K,CC2025,7000,T9602-3-D-1,CC2D35,T9602,CC2D33,ADT,NTC15K,T8200,CC2D335,CHIPCAP 2,NTC10K-II,T2090,T1551,T1552,MPNT3D03750M4,NTC20K,T2007,T8700-D,T8700-E,T8100,T2080,T8100-EC,P40250109,PA0250118,T8100-E-D-GN-5P-R,PA0250115,T1505,P40254275,P40254276,P40254277,P40250189,P40250186,P40250184,P40250185,T8300,P40250182,P40250183,P40250181,AAS-53,8000,PT100,T7001SK,P40250119,NTC10K-A,AOT,P40250117,T9602-5-A,P40250113,P40250114,P40250111,P40250112,DC95F103W,T2076NG,P40250110,P40250193,T9602-5-D,T8001,P40250191,7001D,P40250192,T8002,T9602-5-D-1,MPNV12R30M 16004616,B4B-EH-A,P40250190,T8041-5VI0-5V,RS485,NTC10K-III
数字滤波器(4)—IIR/FIR系统对连续采集数据的滤波处理和模拟仿真
在之前我们的博文中,所提到的数据的滤波处理和仿真分析,其实都是围着一段固定长度的模拟数据展开的,除了知道滤波器的幅频、相频响应特性之外,也直观地看到了滤波的效果会是怎么样的。实际应用会怎么样?需要怎么处理?
技术探讨 发布时间 : 2024-08-27
解析数字滤波器(2)——梳状滤波器及相关话题
本文AMPHENOL SENSORS将围绕但不限于梳状滤波器进行展开。其中,梳状滤波器,一方面可以滤除特定的频率(尤其是特定频率的谐波),另一方面也可以在信号中对指定频率及其倍频的信号进行拣选。例如图-1所示的滤除指定谐波成分的梳状滤波器的幅频图。
技术探讨 发布时间 : 2024-07-25
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
数字滤波器(5)—FIR连续采样分段卷积时域重叠相加法
我们提到了FIR系统在时域的分段卷积中使用“重叠保留(Overlap-Save)”的处理方式,这里我们说明一下“重叠相加(Overlap-Add)”的处理方式。
技术探讨 发布时间 : 2024-08-27
电子商城
品牌: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
现货市场
品牌:SILICON LABS
品类:Switch Hall Effect Magnetic Position Sensor
价格:¥2.2924
现货:126,000
服务
可定制板装式压力传感器支持产品量程从5inch水柱到100 psi气压;数字输出压力传感器压力范围0.5~60inH2O,温度补偿范围-20~85ºС;模拟和数字低压传感器可以直接与微控制器通信,具备多种小型SIP和DIP封装可选择。
提交需求>
可定制温度范围-230℃~1150℃、精度可达±0.1°C;支持NTC传感器、PTC传感器、数字式温度传感器、热电堆温度传感器的额定量程和输出/外形尺寸/工作温度范围等参数定制。
提交需求>
登录 | 立即注册
提交评论