c语言 包络算法,包络检测C程序
最近做項目要提取一個聲音信號的包絡波形,所以花了點時間研究各種包絡提取的算法。
所謂包絡檢測又叫幅度解調,在許多領域都有重要的應用。如果載波信號是確定的,那么通常可以采用同步解調的方式,這種方式的信噪比最好,對信號中混入的噪聲的抑制能力最強。所謂同步解調是通訊領域通常的叫法。在信號檢測領域,這種方式通常稱為“相敏檢波”,鎖相放大器(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
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c语言 包络算法,包络检测C程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原神渔获快速怎么获得
- 下一篇: c语言switch为什么要加break,