动易的网站系统,金融网站源码 asp,免费咨询律师24小时电话,免费企业网站认证最近做项目要提取一个声音信号的包络波形#xff0c;所以花了点时间研究各种包络提取的算法。所谓包络检测又叫幅度解调#xff0c;在许多领域都有重要的应用。如果载波信号是确定的#xff0c;那么通常可以采用同步解调的方式#xff0c;这种方式的信噪比最好#xff0c;…最近做项目要提取一个声音信号的包络波形所以花了点时间研究各种包络提取的算法。所谓包络检测又叫幅度解调在许多领域都有重要的应用。如果载波信号是确定的那么通常可以采用同步解调的方式这种方式的信噪比最好对信号中混入的噪声的抑制能力最强。所谓同步解调是通讯领域通常的叫法。在信号检测领域这种方式通常称为“相敏检波”锁相放大器(Lock-in Amplifier)采用的就是这种方式最典型的例子。如果载波比较乱就像我现在的应用场景要提取噪声的幅度随时间变化的规律那么包络检波法会更适宜。我这里的代码就是采用的包络检波法。包络检波法的基本原理可以看下面这个电路图这个是最基本的半波包络检波。把这个过程用程序来实现就有了下面的代码。/*** 包络检波模拟了硬件半波检波的过程* rc 0 时初始化**/double env_1(double x, double rct){static double old_y 0.0;if(rct 0.0){old_y 0.0;}else{if(x old_y){old_y x;}else{old_y * rct / ( rct 1 );}}return old_y;}void env_2(double x[], double y[], int N, double rct){double xx 0.0;int i;y[0] fabs(x[0]);for(i 1; i N; i){if( x[i] y[i-1]){y[i] x[i];}else{y[i] y[i-1] * rct / ( rct 1 );}}}上面是半波检测的代码只要稍微增加几行就能实现全波检测。/*** 包络检波模拟了硬件全波检波的过程* rc 0 时初始化**/double env_3(double x, double rct){static double old_y 0.0;if(rct 0.0){old_y 0.0;}else{x fabs(x);if(x old_y){old_y x;}else{old_y * rct / ( rct 1 );}}return old_y;}void env_4(double x[], double y[], int N, double rct){double xx 0.0;int i;y[0] fabs(x[0]);for(i 1; i N; i){xx fabs(x[i]);if( xx y[i-1]){y[i] xx;}else{y[i] y[i-1] * rct / ( rct 1 );}}}这个代码中有个参数 rct对应的是硬件电路中的RC时间常数要根据待检测的包络信号的频带来确定。下面是用这个代码实际提取包络的算例。可以看出这个代码的效果还是蛮不错的。(比采用Hilbert变换得到的结果还要好)原文http://blog.csdn.net/liyuanbhu/article/details/38262751