数字滤波器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传感器技术电化学气体传感器的电子电路设计提供指导。
数字滤波器(6)—FIR频域连续滤波“重叠相加法”C++源码
传感器和信号处理仅一线之隔,信号的前后端合理搭配,是我们更准确地感知这个世界的一种基本态度和方式。FIR频域重叠相加法还记得我们(此处有重复之嫌)之前的发文《FIR连续采样分段卷积时域重叠相加法》?不过那是在时域处理的模拟和仿真。这次我们的内容是用C++在频域实现的滤波卷积法,仍然是重叠相加法,届时大家可以比较一下两种方式的差异。基本是通过两个处理过程。
流量传感器(2)超声流量传感器—相位差和信号相关性原理
之前我们简单介绍了基于差压的流量传感器,这次我们要开始基于超声的流量计。超声流量计是一种测量液体或气体流量的仪器,其工作原理基于超声波在介质中传播的特性。这种流量计可以在无需接触或干扰流体本身的情况下进行测量,因此被广泛应用于各种工业环境,尤其是在需要无接触或无损测量的场合。
解析数字滤波器(1)——陷波滤波器
有鉴于数字信号处理涉及的面太多,我们必须要把话题收缩。数字滤波的种类也是五花八门,因此再选一个小的类型,AMPHENOL SENSORS将围绕离散线性时不变系统来简单讨论一下陷波滤波器(Notch Filter)和梳状滤波器(Comb Filter),通过代码的演示和输出,我们可以比较一下这两类滤波器的特点。在本文中先以陷波滤波器为题来讨论相关的内容。
解析数字滤波器(2)——梳状滤波器及相关话题
本文AMPHENOL SENSORS将围绕但不限于梳状滤波器进行展开。其中,梳状滤波器,一方面可以滤除特定的频率(尤其是特定频率的谐波),另一方面也可以在信号中对指定频率及其倍频的信号进行拣选。例如图-1所示的滤除指定谐波成分的梳状滤波器的幅频图。
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(安费诺) 汽车传感器选型指南
目录- 汽车传感器解决方案介绍 车厢空气质量系列传感器 排放处理系列传感器 新能源汽车传感器应用 测量汽车应用中最为关键的参数
型号- 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(安费诺)/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
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
代理传感器顶尖品牌:TE、安费诺、IDT、迈来芯、ROHM、可天士、SMI等15家
为满足工程师在研发过程中对不同品类产品的需求,世强元件电商不断为客户引进顶级的品牌、多样的产品品类。截至目前,平台授权代理的传感器品牌已有15家。平台VIP用户可免费获取来自原厂的最新产品和技术资讯、官方资料库,以低于行业的价格,购买原厂最新元器件和零件产品,享受供货保障。
安费诺先进传感器的MEMS传感器提供最先进的高性能、高性价比的传感器解决方案
NovaSensor(Amphenol Advanced Sensors的子品牌)的MEMS传感器其准确度、可靠性和尺寸大小而闻名于世,NovaSensor的传感器在医疗、运输和工业等领域的应用中提供最佳性能解决方案。
电子商城
品牌: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
服务
支持铲齿散热器鳍片最大加工厚度0.1-10mm,最大宽度600mm,铝挤散热器鳍片最小铝挤厚度5mm,最小鳍片间距1cm;定制散热器产品工艺有热管焊接,穿片,打磨,铲齿,铝挤及CNC加工修边飞面等。
最小起订量: 2pcs 提交需求>
可定制均温板VC最薄0.4mm,有效导热系数超5,000 W / m·K(纯铜(401 W/m·K ,石墨烯1,200 W/m·K)。工作温度范围同时满足低于-250℃和高于2000℃的应用,定制最低要求,项目年采购额大于10万人民币,或采购台套数大于2000套。
提交需求>
登录 | 立即注册
提交评论