实用数字信号处理——笔记与基于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/
作者
SKYlarS
发布于
2023年8月20日
许可协议