|
楼主 |
发表于 2018-2-4 14:54:16
|
显示全部楼层
第一贴的说明中提到FFT转换后的第一个频点是直流分量,有些不太准确。因为如果是采样的音频信号,且加了隔直流电容的话,第一个频点就不是直流分量,而是最低频率点。
对选取的频点又做了写调整,减少了几个点,大于12KZ的就没有选了,因为大于12KZ的柱条跳动的幅度太小,同时这样可以使显示的柱条稍宽些,看上去更舒服些。
//从取模结果lBUFMAG中(前128个)挑选出25个值做显示。挑选的原则是:0-4K为主,4K-8K次之,8K-18K最少。将挑选出的32个值赋给COLUMN1
void arctan(void)
{
u8 i,temp,a[16]={12,15,19,21,25,28,31,37,44,50,63,71,76,89}; //因为后14个无规律,所以将其位置号列出来
//u8 j=2;
for(i=0;i<11;i++)
{ COLUMN1= lBUFMAG;} //挑选前面11个。
for(i=0;i<14;i++) //后14个
{
temp=a;
COLUMN1[i+11]=lBUFMAG[temp];
}
for(i=0;i<25;i++) //增益调整
{
COLUMN1=COLUMN1*10;
//COLUMN1=80*atan(COLUMN1); //用反正切函数来适当压缩较高的模的值,使柱条显示均衡
if(COLUMN1==0)
{COLUMN1=2;}
else if((COLUMN1<5)&&(COLUMN1>0))
{COLUMN1=COLUMN1+15;}
else if((COLUMN1>=5)&&(COLUMN1<10))
{COLUMN1=COLUMN1+12;}
else if((COLUMN1>=10)&&(COLUMN1<15))
{COLUMN1=COLUMN1+10;}
else if((COLUMN1>=15)&&(COLUMN1<20))
{COLUMN1=COLUMN1+7;}
else if(COLUMN1>=240)
{COLUMN1=220;}
else if((COLUMN1>=225)&&(COLUMN1<=235))
{COLUMN1=COLUMN1-30;}
}
} |
|