📄 goertzel.cpp
字号:
// Goertzel.cpp: implementation of the CGoertzel class.
/*
接口说明:
void InitGoertzel(void)
作用:初始化算法参数
用法:采用算法进行检测前执行一次,如果需要改变参数,调用SetParameter();
float CGoertzel::GetMagnitude(unsigned char * sampleData, int length) //算法主接口
作用:对采集下来的音频数据用算法处理,返回一个结果
参数:sampleData-音频数据缓冲地址指针;
length-缓冲区尺寸(音频数据数量),字节数;
返回值:返回算法结果。
void SetParameter(DWORD set_SampleRate, DWORD set_TargetFreq, DWORD set_BlockSize)
作用:设置算法参数;
参数:set_SampleRate-音频数据抽样速率;
set_TargetFreq-目标信号频率;
set_BlockSize -算法块尺寸(采样点);
用法:调用本函数后,需要调用一次InitGoertzel(void)才会生效
*/
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "multitonecheck.h"
#include "Goertzel.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include "math.h"
#define PI 3.1415926
float coeff;
float Q1;
float Q2;
float sine;
float cosine;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGoertzel::CGoertzel()
{
m_sampleRate = 8000;
m_targetFrequency = 941 ;
m_blockSize = 205 ;
}
CGoertzel::CGoertzel(DWORD sampleRate, DWORD targetFrequency, DWORD blockSize)
:m_sampleRate(sampleRate), m_targetFrequency(targetFrequency), m_blockSize(blockSize)
{
}
CGoertzel::~CGoertzel()
{
}
void CGoertzel::InitGoertzel(void) // Goertzel算法初始化函数
{
int k;
float floatN;
float omega;
floatN = (float) m_blockSize;
k = (int) (0.5 + ((floatN * m_targetFrequency) / m_sampleRate));
omega = (float)(2.0 * PI * k) / floatN;
sine = (float) sin(omega);
cosine = (float) cos(omega);
coeff = (float) 2.0 * cosine;
printf("For SAMPLING_RATE = %f", m_sampleRate);
printf(" N = %d", m_blockSize);
printf(" and FREQUENCY = %f,\n", m_targetFrequency);
printf("k = %d and coeff = %f\n\n", k, coeff);
ResetGoertzel();
}
void CGoertzel::ResetGoertzel(void)
{
Q2 = 0;
Q1 = 0;
}
void CGoertzel::ProcessSample(unsigned char sample)
{
float Q0;
Q0 = coeff * Q1 - Q2 + (float) sample;
Q2 = Q1;
Q1 = Q0;
}
void CGoertzel::GetRealImag(float *realPart, float *imagPart)
{
*realPart = (Q1 - Q2 * cosine);
*imagPart = (Q2 * sine);
}
float CGoertzel::GetOptimizedMagnitudeSquared(void)
{
float result;
result = Q1 * Q1 + Q2 * Q2 - Q1 * Q2 * coeff;
return result;
}
float CGoertzel::GetMagnitude(unsigned char * sampleData, int length) //算法主接口
{
// float Real, Imag;
float result;
for (int j=0; j<length; j++)
ProcessSample(*(unsigned char *)(sampleData+j));
/*
GetRealImag(&Real, &Imag); //获得基本Goertzel算法结果
result = sqrt((Real*Real + Imag*Imag));
*/
result = GetOptimizedMagnitudeSquared(); //获得优化Goertzel算法结果
return result;
}
//改变算法参数
void CGoertzel::SetParameter(DWORD set_SampleRate, DWORD set_TargetFreq, DWORD set_BlockSize)
{
m_sampleRate = set_SampleRate;
m_targetFrequency = set_TargetFreq;
m_blockSize = set_BlockSize;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -