求牛人出招!

wgm001 2008-04-02 10:08:25
一段如下的程序:

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();
}


上面的程序GenData意思就是按照字符串01010111..编码成一个正弦波(可用cooledit 按48000,8bit来查看)的数据。
现在问题是,给出文件内容,如何分析出其01010111...


求牛人出招!不胜感谢!分不够开二个贴给!
...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyranly 2008-04-03
  • 打赏
  • 举报
回复
erorr的头像可是经典啊,太多的图像、编码的书都拿这张图来做讲解。
Erorr 2008-04-03
  • 打赏
  • 举报
回复
今天搜了一下,是戈泽尔算法
可以计算某个频点的功率谱,就是能量
其实知道这个算法就解决了一半问题了
LZ再研究下,不要着急,自己解决问题才有收获
最晚周日我贴出完整的代码,如果你还没有搞定:)
tccqs 2008-04-03
  • 打赏
  • 举报
回复
up and mark,,
wgm001 2008-04-03
  • 打赏
  • 举报
回复
偶对数字信号处理的知识几乎为0,所以有部分有点不明白,能否讲解下呢?

for(i=0; i<Ns; i++) // 这中间的Ns是什么值呢? 是不是 (SAMPLE_RATE / 1200)

double cosK=cos(2*pi*k/N); // 这二个中间的N又应该是什么值呢?
double sinK=sin(2*pi*k/N); //

谢谢!
Erorr 2008-04-03
  • 打赏
  • 举报
回复
恭喜了,代码我就不贴了
那段代码原来是DTMF的作业
其实代码我也写不好:)
现在确实在通信公司工作
但原来信号处理的东西用的不多

这个头像原来是全身的,有兴趣的可以搜索,不过教育网不太好用:P

ps:多谢你,我现在2个三角了:)
Eleven 2008-04-03
  • 打赏
  • 举报
回复
Mark!
wgm001 2008-04-03
  • 打赏
  • 举报
回复
我测试下,如果可以,楼上要多少分,我可以开贴再给!
wgm001 2008-04-03
  • 打赏
  • 举报
回复
不过还是希望 Error 能贴一段代码.

i like good code!
wgm001 2008-04-03
  • 打赏
  • 举报
回复
我研究了下戈泽尔算法,然后重写了一段程序,可以使用了!

谢谢楼Error!我说得没错的话,Error应该是在电信(通信)工作的吧?
Erorr 2008-04-02
  • 打赏
  • 举报
回复

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);
}


葛泽尔算法
以前写的程序,数字信号处理的作业,
Re和Im分别是实部和虚部的序列,读入一种频率的数据,也就是0或者1表示的那段,虚部都是零就行了
k就是频率,分别用1200或者2200试试,计算出来的X是一个能量值
用它和输入信号的能量比较,如果大于输入信号的能量,说明和这个频率(1200或者2200)相等,也就是相应的0或者1

快结贴吧!!!!!!
marine8086 2008-04-02
  • 打赏
  • 举报
回复
没看懂题目,"如何分析出其01010111... "
需要分析出什么?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧