实用数字信号处理——笔记与基于C++与python的实验(3)
参考书:《实用数字信号处理:从原理到应用》 Steven W. Smith
本笔记的内容倾向于计算机专业,电路相关的内容会较少而程序方面的会比较多,且能够便于学习(复习)C++的知识;
本文是笔记而不是教程,所以仅供参考;
3.1.卷积
卷积的作用:将两个函数(或信号)之间的信息进行合成或变换,特别是用于滤波和傅里叶变换
公式: $ z(t)=x(t)*y(t)= ∫x(m)y(t-m)dm $
卷积的本质:加权和.
卷积的角度:
输入端:分析输入信号的一个样点是如何对输出端的多个样点产生贡献的
输出端:分析输出信号的一个样点是如何接收到输人信号多个样点的信息
模拟下图:
代码:
vector<double> X={0, -1, -1.3, 2, 1.4, 1.4, 0.6, 0, -0.6};
vector<double> H={1, -0.5, -0.3, -0.2};
vector<double> Y;
Y = convolution_input_side(X, H);
vector_show(Y);
Y = convolution_output_side(X, H);
vector_show(Y);
template <typename T1,typename T2>
vector<double> convolution_output_side(vector<T1> X,vector<T2> H){
vector<double> Y(X.size()+H.size(), 0);
for(int i = 0; i < Y.size(); i++){
for(int j = 0; j < H.size(); j++){
if(i - j < 0)
continue;
if(i - j >= X.size() )
continue;
Y[i] += X[i - j] * H[j];
}
}
return Y;
}
结果:
因为输入数值是肉眼观察的,所以部分数值有出入,但是数值的“位置和趋势”表明了程序是没有问题的;且输出端角度来看也同理。
实用数字信号处理——笔记与基于C++与python的实验(3)
https://skylarshadow.github.io/2023/08/20/dsp-guide3/