教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 资格考试 >

十段图示均衡器实验报告

来源:网络收集 时间:2026-08-23
导读: 十段图示均衡器实验报告 班级:10011107 学号:2011302542 姓名:孔莹莹 一、 实验目的: 均衡器是被广泛应用的音效增强手段,也是实现低音增强、高频补偿、人声清晰度增强等音效的基

十段图示均衡器实验报告

班级:10011107 学号:2011302542 姓名:孔莹莹

一、 实验目的:

均衡器是被广泛应用的音效增强手段,也是实现低音增强、高频补偿、人声清晰度增强等音效的基础。本作业在实现音频 I/O(作业一)的基础上,实现一个具有 GUI 界面的十段均衡器小软件,实时对播放音乐进行音效调整。

二、 实验要求:

本实验要求使用 C/C++语言编程实现一个具有 GUI 界面的图示十段音频均衡器(参考图 3 和演示视频 eq.avi),系统输入为采样率 44.1KHz、单声道的 WAV格式音频文件(如本实验给的 song_mono.wav),输出为经过均衡之后 PCM 数据流,通过声卡播放出来。通过调整界面上的滑动杆或者选择预设效果,实时调整音效。

三、 实验原理:

图示均衡器的原理很简单。图示均衡器由一个低通滤波器,一个高通滤波器和若干带通滤波器并联而成的滤波器组构成。这些构成均衡器的滤波器中心频率和带宽都是不变的,每个滤波器后接一个增益调节器。总输出为各个滤波器的加权求和。用户通过调节每个滤波器的输出增益,来改变均衡器的整体频响。图示均衡器的整体实现框图,如图2 所示

对于10 段图示均衡器,1 倍频程图示均衡器的10 个中心频点为:31.5Hz, 63Hz,125Hz,250Hz, 500Hz, 1000Hz, 2000Hz,4000Hz,8000Hz,16000Hz, 依据这些频点按倍频程公式计算各个频段的边界频率,然后设计各频段的滤波器,然后级联增益调节器再并接起来就构成了10 段图示均衡器。

采用二阶 IIR 带通滤波器级联实现十段图示均衡器。带通滤波器主要性能指标包括中心频率、带宽、增益、品质因子等,现简介如下:

中心频率(CF):通带滤波器功率谱的值达到最大值时对应的频率。

带宽(BW):中心频率两边功率衰减 3dB 时,对应的两个不同频率,分别为上、下截止频率,上、下截止频率之差为带宽。

增益(G):均衡器对于各种音效的实现依靠的最重要指标为增益曲线 ,一般以分贝为单位表示。

品质因子(Q):中心频率与带宽的比值,用来表征滤波器的锐度。

音乐风格

Default

Club

Dance

Full Buss

Full Treble

Pope

Rock

Soft

Large Hall

Party 预设增益 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } { 0, 0, 0, 1, 2, 3, 3, 2, 1, 0 } { 9, 8, 5, 2, 1, 0, -3, -4, -3,0 } { 8, 8, 8, 7, 4, 0, -3, -5,-7,-9 } { -9, -8, -7, -6, -3, 1, 5, 8, 10, 12 } { -2, -1, 0, 2, 3, 2, 0, -2, -2, -1 } { 6, 5, 2, -2, -5, -2, 0, 3, 5, 6 } { 2, 1, 0, 0, -1, 0, 1, 2, 3, 4 } { 8, 7, 6, 3, 2, 0, -1, -2, -1, 0 } { 4, 4, 3, 2, 0, 0, 0, 0, 0, 4 }

四、 实验主要代码:

//音乐风格的预设增益

int PreEft[18][10]={0,0,0,0,0,-1,-2,-4,-6,-9,

0,0,0,1,2,3,3,2,1,0,

9,8,5,2,1,0,-3,-4,-3,0,

0,0,0,0,0,0,0,0,0,0,

8,8,8,7,4,0,-3,-5,-7,-9,

7,6,4,1,-3,-2,-1,2,6,9,

-9,-8,-7,-6,-3,1,5,8,10,12,

1,5,7,3,-2,-1,0,3,6,10,

8,7,6,3,2,0,-1,-2,-1,0,

-4,-3,-1,0,2,3,3,2,1,0,

4,4,3,2,0,0,0,0,0,4,

-2,-1,0,2,3,2,0,-2,-2,-1,

0,0,0,-1,-3,0,2,2,1,0,

6,5,2,-2,-5,-2,0,3,5,6,

-1,-2,-3,-2,0,1,2,3,4,5,

2,1,0,0,-1,0,1,2,3,4,

1,1,1,1,0,-1,-2,-2,0,3,

3,2,1,0,-3,-2,-1,1,3,4};

int CEqualizer::UseEQ(EQPARAM *param, unsigned char *Sig, unsigned char * OutSig, long ILen)

{

unsigned long Hband=(unsigned long)(3*param->Fs/8);

double * bandpow=(double*)malloc(param->wbandlen*sizeof(double)); long i,k,len,level=-1;

for (i=9;i>=0;i--)

{

if (CenBand[i]<Hband)

{level=i;break;}

}

if ((level<1)||((level+1)>param->wbandlen)) return ERR_PARAMERR; if (level==1) return ERR_NOERR;

InitFilterBank(level);

for (i=0;i<param->wbandlen;i++) bandpow[i]=pow(10,(param->wband[i]/20));

double *tSig1=NULL;

double *tSig2=NULL;

if (param->bitpersmp==16)

{

short * sig16=NULL;

if(param->nchn==2)

{

len=ILen>>2;

if(NULL==(tSig1=(double*)malloc(sizeof(double)*len))) return ERR_INSURMEM;

if(NULL==(tSig2=(double*)malloc(sizeof(double)*len))) return ERR_INSURMEM;

sig16=(short*)Sig;k=0;

for (i=0;i<len;i++)

{tSig1[i]=sig16[k++]/32768.;tSig2[i]=sig16[k++]/32768.;} //channel1

WaveDec(tSig1,len);

for (i=0;i<level+1;i++)//add weight

{

k=Lb[i];

while (k<=Le[i]) {C[k]*=bandpow[i];k++;}

}

WaveRec(tSig1,len);

//channel2

WaveDec(tSig2,len);

for (i=0;i<level+1;i++)//add weight

{

k=Lb[i];

while (k<=Le[i]) {C[k]*=bandpow[i];k++;}

}

WaveRec(tSig2,len); //write back to OutSig sig16=(short*)OutSig;k=0; for (i=0;i<len;i++) { if (tSig1[i]>1) sig16[k++]=32767; else if (tSig1[i]<-1) sig16[k++]=-31768; else sig16[k++]=(short)(tSig1[i]*32768); if (tSig2[i]>1) sig16[k++]=32767; else if (tSig2[i]<-1) sig16[k++]=-31768; else sig16[k++]=(short)(tSig2[i]*32768); } } else if(param->nchn==1) { len=ILen>>1; if(NULL==(tSig1=(double*)malloc(sizeof(double)*len))) return ERR_INSURMEM; sig16=(short*)Sig; for (i=0;i<len;i++) {tSig1[i]=sig16[i]/32768.;} //channel1 WaveDec(tSig1,len); for (i=0;i<level+1;i++)//add weight { k=Lb[i]; while (k<=Le[i]) {C[k]*=bandpow[i];k++;} } WaveRec(tSig1,len); //write back to OutSig sig16=(short*)OutSig; for (i=0;i<len;i++) { if (tSig1[i]>1) sig16[i]=32767; else if (tSig1[i]<-1) sig16[i]=-31768; else sig16[i]=(short)(tSig1[i]*32768); } } else return ERR_PARAMERR; } else if (param->bitpersmp==8) {

if(param->nchn==2)

{

len=ILen>>1;

if(NULL==(tSig1=(double*)malloc(sizeof(double)*len))) return ERR_INSURMEM;

if(NULL==(tSig2=(double*)malloc(sizeof(double)*len))) return ERR_INSURMEM;

k=0;

for (i=0;i<len;i++)

{tSig1[i]=(Sig[k++]-128)/128.;tSig2[i]=(Sig[k++]-128)/128.;} //channel1

WaveDec(tSig1,len);

for (i=0;i<level+1;i++)//add weight

{

k=Lb[i];

while (k<=Le[i]) {C[k]*=bandpow[i];k++;}

}

WaveRec(tSig1,len);

//channel2

WaveDec(tSig2,len);

for (i=0;i<level+1;i++)//add weight

{

k=Lb[i];

while (k<=Le[i]) {C[k]*=bandpow[i];k++ …… 此处隐藏:4161字,全部文档内容请下载后查看。喜欢就下载吧 ……

十段图示均衡器实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/105408.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)