十段图示均衡器实验报告
十段图示均衡器实验报告
班级: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字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [资格考试]石油钻采专业设备项目可行性研究报告编
- [资格考试]2012-2013学年度第二学期麻风病防治知
- [资格考试]道路勘测设计 绪论
- [资格考试]控烟戒烟知识培训资料
- [资格考试]建设工程安全生产管理(三类人员安全员
- [资格考试]photoshop制作茶叶包装盒步骤平面效果
- [资格考试]授课进度计划表封面(09-10下施工)
- [资格考试]麦肯锡卓越工作方法读后感
- [资格考试]2007年广西区农村信用社招聘考试试题
- [资格考试]软件实施工程师笔试题
- [资格考试]2014年初三数学复习专练第一章 数与式(
- [资格考试]中国糯玉米汁饮料市场发展概况及投资战
- [资格考试]塑钢门窗安装((专项方案)15)
- [资格考试]初中数学答题卡模板2
- [资格考试]2015-2020年中国效率手册行业市场调查
- [资格考试]华北电力大学学习实践活动领导小组办公
- [资格考试]溃疡性结肠炎研究的新进展
- [资格考试]人教版高中语文1—5册(必修)背诵篇目名
- [资格考试]ISO9001-2018质量管理体系最新版标准
- [资格考试]论文之希尔顿酒店集团进入中国的战略研
- 全国中小学生转学申请表
- 《奇迹暖暖》17-支2文学少女小满(9)公
- 2019-2020学年八年级地理下册 第六章
- 2005年高考试题——英语(天津卷)
- 无纺布耐磨测试方法及标准
- 建筑工程施工劳动力安排计划
- (目录)中国中央空调行业市场深度调研分
- 中国期货价格期限结构模型实证分析
- AutoCAD 2016基础教程第2章 AutoCAD基
- 2014-2015学年西城初三期末数学试题及
- 机械加工工艺基础(完整版)
- 归因理论在管理中的应用[1]0
- 突破瓶颈 实现医院可持续发展
- 2014年南京师范大学商学院决策学招生目
- 现浇箱梁支架预压报告
- Excel_2010函数图表入门与实战
- 人教版新课标初中数学 13.1 轴对称 (
- Visual Basic 6.0程序设计教程电子教案
- 2010北京助理工程师考试复习《建筑施工
- 国外5大医疗互联网模式分析




