19,468
社区成员
发帖
与我相关
我的任务
分享
LPBYTE GenData(char* lpszData)
{
const int SAMPLE_RATE = 48000;
const double PI = 2.0 * asin(1.0);
double f1200 = 2.0 * PI / (SAMPLE_RATE / 1200);
double f2200 = 2.0 * PI / (SAMPLE_RATE / 2200);
double fn = 0.0f;
int count;
char* lpData = new char[strlen(lpszData) * (SAMPLE_RATE / 1200)];
for (int i=0; i< (int)(strlen(lpszData)*(SAMPLE_RATE / 1200)-1); i++)
{
// 生成正弦波信号数据
count = i / (SAMPLE_RATE / 1200);
if (lpszData[count] == '0')
{
fn += f2200;
}
else
{
fn += f1200;
}
lpData[i] = (char)((float)(sin(fn))*50+50)+80;
}
return (LPBYTE)lpData;
}
int main(void)
{
CFile file;
char s[] = "01010101010101010101010101010101111111111111010101010101111111111010101010101011"
"01010101010101010101010101010101010101010101010101010101010101010101010101010101"
"01010101010101010101010101010101010101010101010101010101010101010101010101010101";
file.Open("C:\\s.dat", CFile::modeCreate|CFile::modeWrite);
LPBYTE lpData = GenData(s);
file.Write(lpData, (strlen(s) * (48000/1200)));
delete[] lpData;
file.Close();
}
double Goertzel(double * Re, double * Im, double k) //可以计算复数的Goertzel
{
double X;
int i;
double cosK=cos(2*pi*k/N); //cos(2πk/N)
double sinK=sin(2*pi*k/N); //sin(2πk/N)
tempRe[0]=0;
tempRe[1]=0;
tempRe[2]=0;
for(i=0; i<Ns; i++)
{
tempRe[0] = (2*cosK * tempRe[1]) - tempRe[2] + Re[i] ; //算法
tempRe[2] = tempRe[1];
tempRe[1] = tempRe[0];
tempIm[0] = (2*cosK * tempIm[1]) - tempIm[2] + Im[i] ;
tempIm[2] = tempIm[1];
tempIm[1] = tempIm[0];
}
ReM = tempRe[1]-(cosK*tempRe[2]-sinK*tempIm[2]);
ImM = tempIm[1]-(sinK*tempRe[2]+cosK*tempIm[2]);
X = (ReM*ReM+ImM*ImM); //能量
return(X);
}