请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

快捷登录

手机动态码快速登录

手机号快速注册登录

2022-11-18 11:47:05 · 音箱设备

信号处理-均衡器EQ的原理与应用(含代码)

1、EQ的简介

Audio equalizer filter (音频均衡器)常用的音效调节的一种滤波器。EQ的应用成熟而广泛,在各个场景的运用中神秘又有效。有时候它好似似一种“玄学”,因为对EQ的调节和应用确实能达到一种好的效果,但是在应用层面的争议颇多。
EQ的作用
EQ神奇是因为EQ在,音色、音调,音强方面都有做贡献。在几个维度不断叠加变化,形成特定的风格。总结EQ主要的作用有:改善系统的频率响应、改善声场频率传输、音源处理、分格变迁和降低噪声。
EQ的应用
EQ通常用在各种场景和设备中。比如
这位老铁,就用EQ做HD800的补偿。
在生活中,模拟数字均衡器是比较常用的KTV,以及演唱会,晚会的设备。


由于电脑和手机的发展,数字信号也得到了进一步发展。所以EQ能顺利的在电脑以及手机上进行实现。在播放器中常用EQ来调节音效。比如


今天我们就来分析下EQ的原理以及简单的实现我们自己的EQ。
2、EQ的种类

EQ的种类繁多,但是基本原理都是滤波器的叠加。根据参数的种类可以分为:参数均衡器和图示均衡器。根据滤波器设计又有很多EQ的设计种类:
lowpass:低通滤波器,简单的处理低频效果,允许某部分低频率经过。没有增益效果。
highpass:高通滤波器,简单的梳理高频效果,允许某部分高频率部分经过没有增益效果。
allpass :全通滤波,稳定系统响应,是声音浑浊。
bandpass:允许一定频率内通过。
bandstop:使得一定频率被压制。
low shelf:切断中心频率以下的频率:可调节增益。
hight shelf:切断中心频率以上的频率:可调节增益。
peak filter:尖峰滤波,拉高中心频率增益和频率响应。
notch fliter:压制中心频率的增益和频率响应。
对于low Shelf和Low pass的区别可以参照下面的网站。

接下来我们用peak filter设计一个图示数字均衡器。类似于这样的:


我们也分为10段,每段可调增益为-12DB~12DB。
3、参数和基础概念

在设计之前我们先来了解几个概念,以及给出设计的指标参数等等。
采样频率(Fs):数字信号记录对模拟音频的采样率。


中心频率Fo(Fc):滤波的中心点。
上下限频率(F1,F2):如果是特定的滤波器,一般指频率响应强度下降到-3DB处的频率。而我们设计的peakFilter图示均衡器一般是安装倍频关系分布设计的。


在给定中心频率后,我们直接可以算出上下限的频率。


带宽:描述频率响应的范围


品质因子Q:描述滤波器对频率的影响质量。


增益(gain DB):这里特指中心频率处的增益。
gain = lg(\frac{h(fo)}{h(fo')})
4、图示均衡器的参数设计

给出设计参数
由于人可听见的声音的频率范围在20hz~20khz,我们设计:
一个生源频率是:  Fs=44100Hz,将EQ其分为10段,平均分为一倍及n = 1,品质因子Q 设定为 \sqrt{2} ,上下限频率如下:


增益我们将其分为25个阶段:
-12, -11, -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1,   2,   3,   4, 5,  6,  7,  8,  9, 10, 11, 12。
5、PeakFilter的设计

根据上面的参数我们来设计我们需要的滤波器。其实滤波器设计的方式方法以及设计完成后组成系统,以及滤波器的类型是多种多样的。
数字滤波器的设计方法
模拟转数字:主要采用常用的双曲线变化法和冲击响应不变法。通过在模拟电路公式,推导出你需要的滤波器,然后经过s域向z域进行变化。
数字频域频带变化:以某个原始的z平面转换到其他z平面。
数字滤波器的设计类型:
IIR:计算量小,实时性好。
FIR:稳定性好,相位可控。
多滤波系统设计类型:
级联型:将一层一层的滤波器合并在一块。
并联型:将并行处理各个滤波器,最后才合并。
至于哪个好,没有尝试和测量。

IIR滤波器设计
我们这边就不从模拟滤波推理到数字滤波了,直接挑选二阶的IIR进行设计。给出二级系统响应函数


将 a_{0} 进行归一化


展开到时域


通过以下公式进行参数计算。


OK,到此整个滤波器的设计就完成了。后面是代码书写,和Android apk的测试体验。
6、核心代码

int EQ::EqProcess(int16_t * ibuf, int16_t * obuf, size_t * isamp, size_t * osamp) {
int i = 0;
int inputDataBufferLength = *isamp ;
for (size_t i = 0; i < inputDataBufferLength; i++)
{
      Int32 b;
      int16_t inint16 = ( Int16 )*ibuf ++;
      float x = inint16;

      float outy = 0;
      for (size_t j = 0; j < 10; j++)
      {
           float b0 = mCoef[ j ][0];
           float b1 = mCoef[ j ][1];
           float b2 = mCoef[ j ][2];
           float a1 = mCoef[ j ][3];
           float a2 = mCoef[ j ][4];
           float X1 = mPv[ j ][0];
           float X2 = mPv[ j ][1];
           float Y1 = mPv[ j ][2];
           float Y2 = mPv[ j ][3];
  
           float y = ( x * b0 ) + ( X1 * b1 ) + ( X2 * b2 ) + ( Y1 * a1 ) + ( Y2 * a2 );
           //核心公式
           mPv[ j ][1] = X1;
           mPv[ j ][0] = x;

           x =  y ;
           outy = y;
           mPv[ j ][3] = Y1;
           mPv[ j ][2] = x;
     }
      * obuf ++ = outy > 32767 ? 32767 : ( outy < -32768 ? -32768 : ( Int16 )( outy ) );
}

我们用C++,简单实现了下。理解起来也是比较简单的。
7、APK展示

为了大家方便,做了个apk。apk做的不是很好,界面什么的借用别人的开源的改的。勉强体验下。(感觉这首周杰伦的《默》,挺好听的。)



github路径:
8、总结

这次做这个EQ克服了以下几个问题。
1、原理的理解是比较难的。
2、参数的生成
3、动态库的建立
还存在的问题:
1、是频率的重叠,和高段的处理,目前还没有测试
2、由于时间问题,其他类型EQ没有做尝试

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册 手机动态码快速登录

x

举报

全部评论 20

评论·
·举报
请教下用peak filter拉高中心频率的响应,和分子带用bandpass filter 有什么区别?
2022-11-18 11:42:25
标题错啦,是含代码
2022-11-18 11:42:57
感谢老铁
2022-11-18 11:43:41
截止频率限制不一样
2022-11-18 11:43:50
大佬java能写出均衡器吗
2022-11-18 11:44:40
不用安卓的话
2022-11-18 11:45:00
2022-11-18 11:45:49
那需要哪些jar包呀
2022-11-18 11:46:41
按照原理写就可以了
2022-11-18 11:47:05
123下一页
热门推荐
您需要登录后才可以回帖 立即登录 手机动态码快速登录
说说你的想法......
0
0
0
返回顶部