本发明专利涉及电子设计技术领域,尤其涉及一种音频信号分析仪。
背景技术:
音频信号分析的发展是伴随着一般信号仪器的发展而不断改进的,信号分析仪的发展大致经历了三个阶段年代,以波的干涉,谐振以及滤波原理制成的模拟式分析仪,其功能少,分析速度慢,目前少有使用但其分析时能量集中,分析精度高且分析方法有特色,因此很多数字化仪器保留了模拟式仪器的部分功能年代,由于计算机技术的发展,信号处理由模拟式向数字式转换,发展的以算法为计数原理制成的数字式信号分析仪,这类仪器功能多,分析速度快,是使用中的主流,但是其缺点是功能恒定,不能满足用户的特殊要求,分析功能也无法更新换代近年来,出现了一批基于机的虚拟的信号分析仪,在此基础上,又出现了一批高速专用信号处理器,芯片的出现为通用计算机为主体的智能信号分析仪的产生奠定了基础。
目前,音频分析仪在国内外都有成型的产品,并且可用于测量音频设备的各类音频分析仪器,并且这些分析仪能够完成音频信号的很多指标测试,例如失真度分析仪、频谱分析仪、频率计数器、音频示波器等等,这些机遇各种功能电路的传统分立硬件仪器使用方便,且测量精度较高,已获得广泛使用,但是与此同时,其体积较大且价格往往很昂贵,在一些特殊方面难以普及,并且传统音频信号分析仪存在功能单一,显示结果不直观,调试校准困难等缺点,因此开发一种性价比高的音频信号分析仪就是很有必要的。
附图说明
图1:总体设计框架图。
图2:前级阻抗匹配和放大电路图。
图3:前级阻抗匹配和放大内部电路图。。
图4:ad转换及控制模块电路图。
图5:软件流程图。
图6:周期性分析和测量流程图。
发明专利内容
本发明专利涉及一种音频信号分析仪,本发明以32位mcu为主控制器,通过ad转换,对音频信号进行采样,把连续信号离散化,然后通过fft快速傅氏变换运算,在时域和频域对音频信号各个频率分量以及功率等指标进行分析和处理,然后通过高分辨率的lcd对信号的频谱进行显示。
本发明能够精确测量的音频信号频率范围为20hz-10khz,其幅度范围为5mvpp-5vpp,分辨力分为20hz和100hz两档;测量功率精确度高达1%,并且能够准确的测量周期信号的周期,是理想的音频信号分析仪的解决方案。
具体实施方式
为了使本发明专利的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明专利进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明专利,并不用于限定本发明专利。
本发明专利涉及一种音频信号分析仪,本发明以32位mcu为主控制器,通过ad转换,对音频信号进行采样,把连续信号离散化,然后通过fft快速傅氏变换运算,在时域和频域对音频信号各个频率分量以及功率等指标进行分析和处理,然后通过高分辨率的lcd对信号的频谱进行显示。
进一步的,本发明能够精确测量的音频信号频率范围为20hz-10khz,其幅度范围为5mvpp-5vpp,分辨力分为20hz和100hz两档;测量功率精确度高达1%,并且能够准确的测量周期信号的周期,是理想的音频信号分析仪的解决方案。
进一步的,本发明直接由32位mcu的定时中断进行信号的采集,然后对信号分析。由于32位mcu-lpc2148是60m的单指令周期处理器,所以其定时精确度为16.7ns,已经远远可以实现40.96khz的采样率,而且控制方便成本便宜,所以本发明选择由mcu直接采样。
进一步的,由于快速傅立叶变换fft算法设计大量的浮点运算,由于一个浮点占用四个字节,所以要占用大量的内存,同时浮点运算时间很慢,所以本发明采用普通的8位mcu一般难以在一定的时间内完成运算,综合内存的大小以及运算速度,本发明采用philips的32位的单片机lpc2148,它拥有32k的ram,并且时钟频率高达60m,所以对于浮点运算不论是在速度上还是在内存上都能够很快的处理。
进一步的,本发明选择信号在时域进行周期性分析和周期性测量。对于一般的音频信号,其时域变化是不规则的,所以没有周期性。而对于单频信号或者由多个具有最小公倍数的频率组合的多频信号具有周期性。这样本发明可以在频域对信号的频谱进行定量分析,从而得出其周期性。而本发明通过先假设信号是周期的,然后算出频率值,然后在用此频率对信号进行采样,采取连续两个周期的信号,对其值进行逐次比较和平均比较,若相差太远,则认为不是周期信号,若相差不远(约5%),则可以认为是周期信号。
进一步的,音频信号经过一个由运放和电阻组成的50ohm阻抗匹配网络后,经由量程控制模块进行处理,若是一般的100mv-5v的电压,本发明选择直通,也就是说信号没有衰减或者放大,但是若信号太小,12位的a/d转换器在2.5v参考电压的条件下的最小分辨力为1mv左右,所以如果选择直通的话其离散化处理的误差将会很大,所以若是采集到信号后发现其值太小,在20mv-250mv之间的话,本发明可以将其认定为小信号,从而选择信号经过20倍增益的放大器后再进行a/d采样。经过12位a/d转换器ads7819转换后的数字信号经由32位mcu进行fft变换和处理,分析其频谱特性和各个频率点的功率值,然后将这些值送由atmega16进行显示。信号由32位mcu分析后判断其周期性,然后由atmegal6进行测量,然后进行显示。总体设计框架如图1所示。
进一步的,前级阻抗匹配和放大电路信号输入后通过r5,r6两个100ohm的电阻和一个高精度仪表运放ad620实现跟随作用,由于理想运放的输入阻抗为无穷大,所以输入阻抗即为:r5//r6=50ohm,阻抗匹配后的通过继电器控制是对信号直接送给ad转换还是放大20倍后再进行ad转换。前级阻抗匹配和放大电路如图2所示。
进一步的,本发明选择的运放是ti公司的低噪声、低失真的仪表放大器ina217,其失真度在频率为1khz,增益为20db(100倍放大)时仅为0.004%,其内部原理图如图3所示。其中放大器a1的输出电压计算公式为out1=1+(r1/rg)*vin+,同理,out2=1+(r2/rg)*vin--,r3、r4、r5、r6及a3构成减法器,得到输出公式:vout=(vin2-vin1)*[1+(r1+r2)/rg],r1=r2=5k,取rg=526,从而放大倍数为20。
进一步的,本发明采用12位ad转换器ads7819进行转换,将转换的数据送32位控制器进行处理。ad转换及控制模块电路如图4所示。
进一步的,功率谱测量主要通过对音频信号进行离散化处理,通过fft运算,求出信号各个离散频率点的功率值,然后得到离散化的功率谱。由于本发明要求频率分辨力为100hz和20hz两个档,这说明在进行fft运算前必须通过调整采样频率(fk)和采样的点数(n),使其基波频率f为100hz和20hz。根据频率分辨率与采样频率和采样点数的关系:f=fk/n;可以得知,fk=n*f;又根据采样定理,采样频率fk必须不小于信号频率fm的2倍,即:fk>=2fm;本发明要求的最大频率为10khz,所以采样频率必须大于20khz,考虑到fft运算在2的次数的点数时的效率较高,所以本发明在20hz档时选择40.96khz采样率,采集2048个点,而在100档时我们选择51.2khz采样率,采集512个点。通过fft分析出不同的频率点对应的功率后,就可以画出其功率谱,并可以在频域计算其总功率。
进一步的,本发明的主控制芯片为lpc2148,测量周期为atmega16实现,由于处理器速度较快,所以本发明采用c语言编程方便简单。软件流程图如图5所示,周期性分析和测量流程图如图6所示。
进一步的,本发明的程序代码如下:
fft转换函数,datar:实部,datai:虚部,
voidfft(float*datar,float*datai,intn)
{
inti,l,j,k,b,p,xx,qq;
intx[11]={0};
floattr,ti,temp;
floatqq;
{xx=0;
for(j=0;j<n;j++)
x[j]=0;
for(j=0;j<n;j++)
{x[j]=(i/count[j])&0x01;}
for(j=0;j<n;j++)
{xx=xx+x[j]*count[n-j-1];}
datai[xx]=datar[i];
}
for(i=0;i<count[n];i++)
{datar[i]=datai[i];
datai[i]=0;
}
for(l=1;l<=n;l++)
{
b=1;i=l-1;
while(i>0)
{b=b*2;
i--;
}
for(j=0;j<=b-1;j++)
{p=1;i=n-l;
while(i>0)
{p=p*2;i--;}
p=p*j;
for(k=j;k<count[n];k=k+2*b)
{
tr=datar[k];
ti=datai[k];
temp=datar[k+b];
qq=2*pi*p/count[n];
qq=p*count[11-n];
datar[k]=datar[k]+datar[k+b]*cos_tab[qq]+datai[k+b]*sin_tab[qq];
datai[k]=datai[k]-datar[k+b]*sin_tab[qq]+datai[k+b]*cos_tab[qq];
datar[k+b]=tr-datar[k+b]*cos_tab[qq]-datai[k+b]*sin_tab[qq];//查表运算
datai[k+b]=ti+temp*sin_tab[qq]-datai[k+b]*cos_tab[qq];
}
}
}
for(i=0;i<count[n];i++)
{
w[i]=sqrt(datar[i]*datar[i]+datai[i]*datai[i]);
w[i]=w[i]/count[n-1];
}
w[0]=w[0]/2;
}
{
unsignedintkey,page,i;
page=0;
lcd_pencolor=0x1f;//红色
lcd_writechinesestring(font5,2,40,0);
lcd_pencolor=0xfc;//蓝色
while(1){
key=getkey();
if(key!=0xff)
{
if(key==4){systemstate=fft_mode;return;}//返回
if(key==2){
lcd_clearscreen();
cd_writechinesestring(font3,2,10,0);lcd_writechinesestring(font4,2,60,0);
i=page*4+1;
p3510(re[i],0,15);print3510(im[i]*mode,50,15);
p3510(re[i+1],0,26);print3510(im[i+1]*mode,50,25);
p3510(re[i+2],0,38);print3510(im[i+2]*mode,50,35);
p3510(re[i+3],0,50);print3510(im[i+3]*mode,50,50);
if(page>0)page--;
delay_nms(8000000);
}//上翻页
if(key==1){
lcd_clearscreen();
_writechinesestring(font4,2,60,0);
i=page*4+1;
p3510(re[i],0,15);print3510(im[i]*mode,50,15);
p3510(re[i+1],0,26);print3510(im[i+1]*mode,50,25);
p3510(re[i+2],0,38);print3510(im[i+2]*mode,50,35);
p3510(re[i+3],0,50);print3510(im[i+3]*mode,50,50);
page++;if(page>=samplenum/4)page=0;
delay_nms(8000000);
}//下翻页
}
}
}
voiddistortion(void)
{
lcd_clearscreen();
lcd_writechinesestring(font6,3,10,20);
unsignedintkey;
intfr;
while(1)
{
log_2_n=11;samplenum=sampletab[log_2_n];
reset_timer(0);
init_timer0(40960);
new_flag=0;
enable_timer(0);
while(!fft_flag);
disable_timer(0);//关定时器0
fft(re,im,log_2_n);
for(i=1;i<samplenum/2;i++){re[i]=re[i]*re[i];re[i]=re[i]/2;}
fp=0;
for(i=1;i<samplenum/2;i++)fp+=re[i];
sort(&re[1],&im[1],samplenum/2-1);
fr=1000000/fre;
if(tflag){lcd_writechinesestring(font7,1,50,20);lcd_writeenglishstring("",0,38);print3510(fr,10,38);lcd_writeenglishstring("us",58,38);}
else
{lcd_writeenglishstring("",0,38);lcd_writechinesestring(font8,1,50,20);}
key=getkey();
if(key!=0xff)
{
if(key==1){systemstate=fft_mode;mode=20;break;}//返回
if(key==2){systemstate=fft_mode;mode=100;break;}//返回
}
}
}
unsignedchargetkey(void)
{
if(io1pin_bit.p1_21==0){
delay_nms(200000);
if(io1pin_bit.p1_21==0)return1;
}
if(io1pin_bit.p1_22==0){
delay_nms(2000000);
if(io1pin_bit.p1_22==0)return2;
}
if(io1pin_bit.p1_23==0){
delay_nms(2000000);
if(io1pin_bit.p1_23==0)return3;
}
if(io1pin_bit.p1_24==0){
delay_nms(2000000);
if(io1pin_bit.p1_24==0)return4;
}
return0xff;
}
voidsort(float*a,float*b,intn)//a为待排序的量,b为起位置
{
inti,j,temp;
for(i=0;i<n;i++)b[i]=i+1;
for(j=0;j<=n-1;j++)
{
for(i=0;i<n-j;i++)
if(a[i]<a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
temp=b[i];
b[i]=b[i+1];
b[i+1]=temp;
}
}
}
voidp3510(intv,intx,inty)
{
intx0;
x0=v*157;
x0=x0/100000000;
lcd_writeenglishchar(x0+'0',x,y);
x0=v*157;
x0=x0/100;
x0+=1000000;
print3510(x0,x+6,y);
lcd_writeenglishchar('.',x+6,y);
}
以上所述仅为本发明专利的较佳实施例而已,并不用以限制本发明专利,凡在本发明专利的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明专利的保护范围之内。