最新幅频均衡F题.docx
《最新幅频均衡F题.docx》由会员分享,可在线阅读,更多相关《最新幅频均衡F题.docx(18页珍藏版)》请在冰豆网上搜索。
最新幅频均衡F题
幅频均衡(F题)
数字幅频均衡放大器
摘要:
本系统采用LM3S811作为主控制器,通过前置放大、滤波、阻带网络,再经过幅频均衡,对信号进行处理,使得数字滤波处理后波形与阻带网络前波形相同,再对信号进行功率放大,尽量使得所得功率最大。
关键词:
LM3S811、前置放大、带通滤波、数字均衡、低频功放
一、系统方案分析
随着数字信号处理技术的发展,单片机技术已广泛应用于各个领域。
借助于现代数字电子及数字信号处理技术,需对不规则的信号进行还原。
围绕这一课题我们进行方案选择与论证、系统的软硬件设计与调试,基本实现了课目的某些项指标和要求。
并在此基础上,撰写了本报告的。
整个系统分为前置放大、带通滤波、阻带网络、数字均衡及功率放大几个部分,系统总方案和实现方框图如下:
由于信号比较微弱,放大倍数比较大,因此可采用低噪声窄运放对信号进行放大,只要在20HZ—20KHZ频带内保持平坦,纹波小于1dB就可以满足要求,此外,要求输出阻抗为600Ὠ,可以在运放的输出端串联600Ὠ的电阻直接接入下一级;在电路设计的每一个模块都对前后的电路都有影响,故用电压跟随器分隔开。
考虑到信号经过带阻网络后信号没有直流偏置,而LM3S811数字滤波采样只能对正电压进行滤波处理,故在数字滤波前时采用钳位电路对信号进行抬高。
功率放大模块采用甲乙类功放,因为它的理论效率可达78.5%,并且发热相对较小,失真率比小,符合题目的要求。
二、前置放大器的设计
2.1前置放大的硬件设计
可控增益宽带放大器由芯片OP37构成。
可控增益放大器由op37运放构成,op37是低漂移,高速,增益带宽高,允许精确的高增益。
本题中采用一片此芯片构成放大级,电路图如图1所示。
图1前级放大电路
由图可知,最大放大倍数可达650倍,可根据电位器来调节,符合题目要求。
实验中输入10mv(Vpp)电压,输出5Vpp,放大倍数为500倍。
2.2带通滤波器的设计
方案一:
采用无源滤波
由于无源滤波通过电感和电容的匹配对某次谐波并联低阻(调谐滤波)状态,给某次谐波电流构成一个低阻态通路。
这样谐波电流就不会流入系统,缺点为谐波滤除率一般只有80%,对基波的无功补偿也是一定的。
方案二:
有源滤波
有源滤波自身就是谐波源。
在检测到系统谐波的同时产生一组和系统幅值相等,相位相反的谐波向量,这样可以抵消掉系统谐波,使其成为正弦波形。
有源滤波除了滤除谐波外,同时还可以动态补偿无功功率。
其优点是反映动作迅速,滤除谐波可达到95%以上,补偿无功细致。
故采用此方案。
2.3带阻网络设计
根据本题中要求,所制作的带阻网络对前置放大电路所输出的信号进行带阻滤波,根据题目要求,制作带阻网络对前置放大电路输出信号进行滤波,以10kHz时输出信号电压幅度为基准,要求最大衰减≥10dB。
2.14钳位电路设计
由于ARM系统对信号的处理只能是正的,不能处理负的数值,故需要对输入波形进行直流偏置,使得电压抬高都为正值,故采用钳位电路设计方案。
钳位电路的作用是将周期性变化的波形的顶部或底部保持在某一确定的直流电平上。
图上部为常见的二极管钳位电路。
二极管的钳位作用是指利用二极管正向导通压降相对稳定,且数值较小(有时可近似为零)的特点,来限制电路中某点的电位。
钳位电路设计如图5所示。
图2钳位电路
在上面电路中,Vcc为输入直流电压,已达到电路的完全偏移。
电路中电阻设的要很大,以便延迟充放电时间。
实际测量中,Vcc为0.5V,R=200K,前级噪声24.4mv(Vpp)。
三、数字均衡方法比较与选择
3.1系统方案论述
3.1.1数字信号处理器选择
方案一:
高速FPGA可用VerilogHDL语言设计专用的数字信号处理电路,由硬件实现信号处理,速度得到了保证,也就可以得到很好的带宽平坦度,但FPGA价格昂贵,开发周期长,且本课题仅要求对20Hz-20kHz的音频信号进行处理,采用高速FPGA过于浪费资源。
方案二:
DSP处理器具有合适于数据进行快速运算的硬件结构,工作频率高,算法成熟,是实现数字信号运算与处理的理想方案,完全可胜任系统要求,但DSP处理器同样存在成本高的问题。
方案三:
ARM微控制器通过锁相环倍频可使主频达到相当高的工作频率,其成本相对FPGA、DSP更低,只要数字信号处理算法设计合理,用于处理音频段范围内的信号问题不大。
综上所述,采用ARM系列的LM3S811微控制器作为数字信号处理器较为合适。
3.1.2 数字幅频均衡方法选择
方案一:
利用FFT快速运算的办法对输入信号进行离散傅立叶变换,分析其频谱,然后根据所希望的频率特性进行滤波,再利用傅立叶反变换将频域信号恢复至时域信号,但FFT是块计算,对速度较高的FPGA和DSP处理器可行,若采用单片机或ARM微控制器作为数字信号处理器,则难以满足设计要求。
方案二:
采用无限冲激响应滤波器IIR,IIR滤波器设计简单,实现的阶数较低,但它具有非线性相位,且由于其为反馈型结构,对滤波器的参数精度要求较高,否则可能引起震荡或发散。
方案三:
采用有限冲激响应FIR滤波器,FIR滤波器采用非递归结构,可以得到严格的线性相位,运算误差较小,且传递函数不存在极点,稳定性好,但与IIR相比,相同条件下需要的阶数更高,导致延时时间较长。
由于本次设计采用ARM控制器,运算速度相对DSP和FPGA较低,所以滤波器阶数不能太高,故采用了IIR数字滤波器。
四、低频功放的硬件设计
按功放中功放管的导电方式不同功率放大器分有甲类(又称A类)、乙类(又称B类)、甲乙类(又称AB类)、和丁类(又称D类)。
方案一:
甲类功放。
甲类功放是指在信号的整个周期内(正弦波的正负两个半周),放大器的任何功率输出元件都不会出现电流截至(即停止输出)的一类放大器。
甲类放大器工作时会产生高热,效率很低,但固有的有点是不存在就交越失真。
单端放大器都是甲类工作方式,推免放大器可以是甲类,也可以是乙类或甲乙类。
因此甲类在输入信号的一个周期内都导通,晶体管导通角度为θ=360°,特点是线性好、失真小且失真成分以偶次谐波为主。
效率小于50%,所以不符合题目中≥60%的要求。
方案二:
乙类功放。
乙类功放是指正弦信号的正负两个半周分别由推免输出级的两“臂”轮流放大输出的乙类放大器,每一“臂”的到点时间为信号的半个周期,乙类放大器的优点是效率高,缺点是会产生交越失真。
乙类功放晶体管只在输入信号正半周工作在放大区(导通)晶体管导通角度为θ=180°,乙类功放的效率平均约为75%,产生的热量较甲类机低,容许使用较小的散热器。
方案三:
甲乙类功放。
甲乙类功放界于甲类和乙类之间,推免放大的每一个“臂”导通时间大于信号的半个周期而小于一个周期,甲乙类放大有效解决了乙类放大器的交越失真问题,效率又比甲类放大器高,因此获得了极为广泛的应用。
甲乙类功放在信号的大半周期间导通,导通角度180°<θ<360°。
方案四:
丁类功放。
D类功率放大器工作于开关状态,理论效率可达100%,实际的运用也可达80%以上。
功率器件的耗散功率小,产生热量少,可以大大减小散热器的尺寸,连续输出功率很容易达到数百瓦。
功率MOS有自保护电路,可以大大简化保护电路,而且不会引入非线性失真。
但是相对设计电路比较复杂。
根据题目的要求,功率放大器接8电阻负载(一端接地)时,要求输出功率≥10W,输出电压波形无明显失真,功率放大电路的-3dB通频带为20Hz~20kHz,功率放大电路的效率≥60%。
综上四个方案的比较,我们决定采用甲乙类功放,效率高于60%,且所需的电路并不难。
功放的电路流程图如下:
图3功放硬件电路设计流程图
音频放大器输出失真度小于某一数值(r<1%)的最大功率称为额定功率,表达式
Po=Uo2/RLPi=Ui2*I
Uo为负载两端的最大不失真电压,RL为额定负载阻抗。
五、软件设计
5.1软件设计
本次设计,利用LM3S811的片内的十位AD,很方便地实现AD转换,经过IIR滤波器后,DA输出。
由于没有片内DA,所以DA需要外扩,采用了12位高速DA转换芯片MAX7541,只要不断地往其12个数据口发送数据,就能实现DA转换。
5.1.1基于matlab的IIR滤波器设计
设IIR数字滤波器的输入为x(k),输出为y(k),则该滤波器的可用常系数差分方程表示为
其中ai、bi为常系数,N、M为整数,i=0,1,2,…,k=0,1,2,…,其传递函数为
IIR滤波器的设计过程主要是寻找滤波器的各个系数,使其逼近所要求的特性指标。
其设计方法有两种:
一是直接法,也称最优化设计法,先确定一种最优化准则(均方误差最小准则或最大误差最小化准则),再求此最佳准则下的滤波器系数;二是间接法,先根据已有模拟滤波器的设计理论设计一个合适的滤波器,然后变换成满足技术指标的数字滤波器。
间接设计法也称经典设计法,如果设计的IIR数字滤波器频率特性有特殊要求,经典设计往往显得无能为力,而最优设计法在这些频率特性有要求的场合很有用场。
MATLAB提供了yulewalk和maxflat两个最优设计函数Error!
Referencesourcenotfound.。
5.1.2IIR具体设计
本系统处理信号的频率特性比较特殊,故利用yulewalk最优设计函数设计IIR滤波器,首先测出带阻网络的幅频特性,fs为采样频率,f为0到fs/2的频率点,M为各频率点对应的放大倍数,然后对M取倒数,得到m。
本次设计滤波器的阶数为5,则调用函数
[b,a]=yulewalk(4,f,m)
得到滤波器的参数如下
b=[1.2083,-0.9642,-0.3355,0.3357,0.0567]
a=[1.0000,-1.2246,0.0116,0.5014,-0.1455]
由系数b和a可得常系数差分方程
其中b=[1.2083,-0.9642,-0.3355,0.3357,0.0567],a=[1.0000,-1.2246,0.0116,0.5014,-0.1455]
k=0,1,2,3,4。
根据上述差分方程进行软件编程并固化程序,即可使微控制器LM3S811实现IIR滤波的功能。
图中红线为理想滤波器的幅频特性,而蓝线为得到的滤波器的幅频特性。
六、附录
(一)硬件电路附录
6.1带通滤波电路图与测试结果:
图2-1dB(20HZ-20KHZ)带通滤波电路
在电路中,虚线左端是20Hz高通滤波器,虚线右端是20KHz低通滤波器。
此电路是带通可调的滤波器,可以调节电位器的值来调节带通范围,具有更实用性。
频率(KHz)
0.02
0.03
0.04
0.08
0.2
0.6
1.0
5.0
10.0
14.0
18.0
19.0
20.0
输出Vpp(v)
4.48
4.80
4.96
5.12
5.12
5.12
5.12
5.04
5.00
4.96
4.80
4.64
4.45
-1dB时,即衰减到0.89时,如输出通频带为5V,则截止时为4.45。
根据表格可知,符合带通滤波设计要求。
6.2前级输出电阻测量
空载输出电压
加入600欧电阻负载电压
2.74V
1.37V
可知符合600欧输出电阻的要求。
6.3本次制作的带阻网络电路图
带阻网络测试
测试输入信号VPP=5V
频率/HZ
20
40
100
300
500
600
800
900
1K
输出
1.21
1.05
0.66
0.45
0.41
0.41
0.39
0.38
0.4
频率/HZ
4K
6K
8K
10K
12K
14K
16k
18k
20k
输出
0.52
0.62
0.72
0.82
0.92
0.96
1.02
1.04
1.06
图3带阻网络电路图
根据题目所给的带阻网络结构,我们采用Multism进行了辅助分析与设计,其幅频性的分析结果如下图4所示。
图4仿真图
由图可知,在10KHZ时,输出信号大约在-10dB,信号的最大衰减为-25dB,故满足题目要求。
但特别注意,仿真都是理想状态,要想实际达到要求,必须提高电路中电容、电感、电阻的精度。
6.4功率放大电路图及测试
图7功放前置20Hz到20KHz的带通滤波
图8前级放大和功率放大电路
功放测试:
测试条件:
带8欧姆负载,由信号发生器输入5VVPP信号
频率
20
50
100
200
500
1000
2000
5000
10k
15k
20k
输入电压/V
10.6
10.6
10.6
10.6
10.6
10.6
10.6
10.6
10.6
10.6
10.6
波形失真
无明显失真
无明显失真
无明显失真
无明显失真
无明显失真
无明显失真
无明显失真
无明显失真
无明显失真
无明显失真
无明显失真
功率输出/W
10.2
10.3
12.1
12.1
10.2
11.0
11.1
11.7
11.1
11.8
10.8
效率
6.5外扩D/A电路
图4MAX7541引脚图
则DA外扩电路如下:
图5MAX7541外接电路图
(二)程序设计附录
程序流程图如下
主函数流程图中断服务程序流程图
源程序代码
/*PD0~PD7接B0~B7,PA0~PA3接B8~B11*/
#include
#include
#include
#include
#include
#include
#include
#include
//将较长的标识符定义成较短的形式
#defineSysCtlPeriEnableSysCtlPeripheralEnable
#defineSysCtlPeriDisableSysCtlPeripheralDisable
#defineGPIOPinTypeInGPIOPinTypeGPIOInput
#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput
#defineGPIOPinTypeODGPIOPinTypeGPIOOutputOD
#defineADCSequEnableADCSequenceEnable
#defineADCSequDisableADCSequenceDisable
#defineADCSequConfigADCSequenceConfigure
#defineADCSequStepConfigADCSequenceStepConfigure
#defineADCSequDataGetADCSequenceDataGet
#defineKEY_PERIPHSYSCTL_PERIPH_GPIOB
#defineKEY_PORTGPIO_PORTB_BASE
#defineKEY_PINGPIO_PIN_5
#defineDATA_PERIPH_8SYSCTL_PERIPH_GPIOD
#defineDATA_PORT_8GPIO_PORTD_BASE
#defineDA_PINS_8
GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
#defineDATA_PERIPH_4SYSCTL_PERIPH_GPIOA
#defineDATA_PORT_4GPIO_PORTA_BASE
#defineDATA_PINS_4GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
#defineN7//IIR滤波器阶数
intb[N+1]={6656,-9185,1559,5564,-4080,168,582,-92};//IIR滤波器系数
inta[N+1]={10000,-14301,886,9744,-5991,-639,1146,-25};
unsignedlongx[N+1]={0};//采样序列
unsignedlongy[N+1]={0};//输出序列
unsignedlongTheSysClock;//系统时钟
unsignedlongADC_DATA;
intADC_EndFlag=0;//AD采样阶数标志
/************防止jtag锁死函数**********************/
voidjtagWait(void){
SysCtlPeriEnable(KEY_PERIPH);//使能KEY所在的GPIO端口
GPIOPinTypeIn(KEY_PORT,KEY_PIN);//设置KEY所在管脚为输入
if(GPIOPinRead(KEY_PORT,KEY_PIN)==0x00)//若复位时按下KEY,则进入
{
for(;;);//死循环,以等待JTAG连接
}
SysCtlPeriDisable(KEY_PERIPH);//禁止KEY所在的GPIO端口
}
/*******************系统时钟初始化函数************************/
voidclockInit(void)
{
/*SysCtlLDOSet(SYSCTL_LDO_2_50V);//设置LDO输出电压
SysCtlClockSet(SYSCTL_USE_OSC|//系统时钟设置
SYSCTL_OSC_MAIN|//采用主振荡器
SYSCTL_XTAL_6MHZ|//外接6MHz晶振
SYSCTL_SYSDIV_1);//不分频*/
SysCtlLDOSet(SYSCTL_LDO_2_75V);//配置PLL前须将LDO设为2.75V
SysCtlClockSet(SYSCTL_USE_PLL|//系统时钟设置,采用PLL
SYSCTL_OSC_MAIN|//主振荡器
SYSCTL_XTAL_4MHZ|//外接4MHz晶振
SYSCTL_SYSDIV_4);//4分频
TheSysClock=SysCtlClockGet();//获取当前的系统时钟频率
}
/*****************Timer初始化*************************/
voidtimerInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_TIMER2);//使能Timer模块
TimerConfigure(TIMER2_BASE,TIMER_CFG_32_BIT_PER);//配置Timer为32位周期定时
TimerControlTrigger(TIMER2_BASE,TIMER_A,true);//使能内部触发脉冲的产生
TimerControlStall(TIMER2_BASE,TIMER_A,true);//调试时暂停计数(必要!
)
TimerLoadSet(TIMER2_BASE,TIMER_A,600);//设置Timer初值,SysCtlClockGet()是定时1s,SysCtlClockGet()/2是定时0.5s
TimerEnable(TIMER2_BASE,TIMER_A);//使能Timer计数
}
/****************ADC初始化*********************/
voidadcInit(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_ADC);//使能ADC模块
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_250KSPS);//设置ADC采样率
ADCSequDisable(ADC_BASE,1);//禁止采样序列
ADCSequConfig(ADC_BASE,1,ADC_TRIGGER_TIMER,0);//采样序列配置:
ADC基址,采样序列0,定时器触发,采样优先级0
ADCSequStepConfig(ADC_BASE,1,0,ADC_CTL_CH1|ADC_CTL_END|ADC_CTL_IE);//采样步进设置:
ADC基址,采样序列0,步值0,采样ADC0后停止并申请中断
ADCIntEnable(ADC_BASE,1);//使能ADC中断
IntEnable(INT_ADC1);//使能ADC采样序列中断
IntMasterEnable();//使能处理器中断
ADCSequEnable(ADC_BASE,1);//使能采样序列
}
/************ADC采样******************/
unsignedlongadcSample(void)
{
unsignedlongulValue;
while(!
ADC_EndFlag);//等待采样结束
ADC_EndFlag=0;//清除ADC采样结束标志
ADCSequDataGet(ADC_BASE,1,&ulValue);//读取ADC转换结果
return(ulValue);
}
/*********DAC输出函数***********************/
voidDAC(unsignedlongdata)
{
GPIOPinWrite(DATA_PORT_4,DATA_PINS_4,((data&0xF00)>>8));//送高四位数据
GPIOPinWrite(DATA_PORT_8,DATA_PINS_8,(data&0x0FF));//送低八位数据
}
/*****将上次存入数组元素整体左移一次,丢弃第一个元素*****/
voidMoveNext(void)
{inti=0;
for(i=0;i{
x[i]=x[i+1];
y[i]=y[i+1];
}
}
/******************IIR滤波*********************/
voidIIR()
{
inti;
unsignedlongsum=0;
for(i=0;i{
sum+=b[i]*x[N-i]-y[i]*a[N-i];
}
y[N]=sum+b[N]*x[0];
}
main()
{
jtagWait();//系统初始化
clockInit();
timerInit();
adcInit();
SysCtlPeriEnable(DATA_PERIPH_8);//初始化DA输出口
GPIOPinTypeO