|
楼主 |
发表于 2011-3-1 10:24:10
|
显示全部楼层
回复【1楼】zhangsusu
-----------------------------------------------------------------------
谢谢 zhangsusu,呵呵
我现在疑惑的是 为什么 仿真 浮点运算是正确的 下载运行的就不对呢
当然通过定点可以解决这个问题
但是根本原因还是没找到啊
期待高人指点
程序如下
//计算阻尼比
void cacldamp(Int16 *sounddataorg)
{
//最大值点数组
Uint16 peakpointindex[peakpointcount];
Uint16 peakpoint[peakpointcount];
Uint16 peakpointindextmp;
//最大峰值点索引
Uint16 Maxpeakpointindex;
Uint16 i;
double damptmp;
//找出波形所有的峰值
peakpointindextmp=0;
for (i=SonicPM.SoundDecay.WindowStart;i<sounddataorgmax_1;i++)
{
if (sounddataorg>=sounddataorg[i+1] && sounddataorg>sounddataorg[i-1])
if (sounddataorg>=sounddataorg[i+2] && sounddataorg>sounddataorg[i-2])
{
//取过极大值点
peakpointindex[peakpointindextmp]=i;
peakpoint[peakpointindextmp]=sounddataorg;
peakpointindextmp++;
}
//如果采集够指定的波形数就跳出循环
if (peakpointindextmp>peakpointcount)
{
break;
}
}//for
//如果极大值点个数大于0为正常,继续处理
if (peakpointindextmp>0)
{
//for (i=0;i<peakpointindextmp;i++)
//{
if( peakpointindextmp>SonicPM.SoundDecay.WindowLength)
{
Maxpeakpointindex=getpeakpositonUint16(peakpoint,peakpointindextmp-SonicPM.SoundDecay.WindowLength);
}
else
{
Maxpeakpointindex=getpeakpositonUint16(peakpoint,peakpointindextmp);
}
//}
//获得点数长度方便显示
SonicPM.SoundDecay.WindowStartPoint=peakpointindex[Maxpeakpointindex];
SonicPM.SoundDecay.WindowLengthPoint=peakpointindex[Maxpeakpointindex+SonicPM.SoundDecay.WindowLength];
//计算峰值频率
damptmp=100000*log(
( (double)peakpoint[Maxpeakpointindex]/
(double)peakpoint[Maxpeakpointindex+SonicPM.SoundDecay.WindowLength] )
);
//阻尼比计算公式 1/n * ln (An/A1)
/*
damptmp=damptmp/
((double)peakpointindex[Maxpeakpointindex+SonicPM.SoundDecay.WindowLength]
-
(double)peakpointindex[Maxpeakpointindex]
);
*/
damptmp=damptmp/(double)(SonicPM.SoundDecay.WindowLength);
damptmp=damptmp/2.0;
damptmp=damptmp/3.1415926;
SonicPM.DetDamp=(Int16)damptmp;
}
else
{
//计算峰值频率
SonicPM.DetDamp=-1;
}
其中 sounddataorg 是采集的声音数据 16位int
格式的
函数的功能是 找出波形的最大的幅值 然后间隔n个波形的最大值
计算波形的衰减系数
算式是 衰减=1/n * Ln(A1/An)
A1 An 都不超过 32768 也进行了强制转换 为double 了
仿真计算结果正确 下载后 计算结果为 0x7FFFFH |
|