文档章节

数字音乐均衡器

abcijkxyz
 abcijkxyz
发布于 2016/11/22 16:45
字数 723
阅读 11
收藏 1

很多音乐播放软件都有均衡器,例如千千静听的数字均衡器效果如下:

这是一个10段均衡器。

 

均衡器实际上就是一组带通滤波器。对于学过数字信号处理的人,要设计这样一组滤波器并不是什么难事情。

这里我做了一个简单的均衡器,这个均衡器只有3段,即对低频,中频和高频进行调整。

 

1. 均衡器相关结构定义如下:

 1 typedef struct
 2 {  3   // Filter #1 (Low band)
 4 
 5   double  lf;       // Frequency
 6   double  f1p0;     // Poles ...
 7   double f1p1;  8   double f1p2;  9   double f1p3; 10 
11   // Filter #2 (High band)
12 
13   double  hf;       // Frequency
14   double  f2p0;     // Poles ...
15   double f2p1; 16   double f2p2; 17   double f2p3; 18 
19   // Sample history buffer
20 
21   double  sdm1;     // Sample data minus 1
22   double  sdm2;     // 2
23   double  sdm3;     // 3 24 
25   // Gain Controls
26 
27   double  lg;       // low gain
28   double  mg;       // mid gain
29   double  hg;       // high gain
30   
31 } EQSTATE;  

2. 初始化均衡器的状态

 1 void init_3band_state(EQSTATE* es, int lowfreq, int highfreq, int sample_rate)  2 {  3   // Clear state 
 4 
 5   memset(es,0,sizeof(EQSTATE));  6 
 7   // Set Low/Mid/High gains to unity
 8 
 9   es->lg = 1.0; 10   es->mg = 1.0; 11   es->hg = 1.0; 12 
13   // Calculate filter cutoff frequencies
14 
15   es->lf = 2 * sin(M_PI * ((double)lowfreq / (double)sample_rate)); 16   es->hf = 2 * sin(M_PI * ((double)highfreq / (double)sample_rate)); 17 }

3. 执行滤波的过程

 1 double do_3band(EQSTATE* es, double sample)  2 {  3   // Locals
 4 
 5   double  l,m,h;      // Low / Mid / High - Sample Values  6 
 7   // Filter #1 (lowpass)
 8 
 9   es->f1p0  += (es->lf * (sample   - es->f1p0)) + vsa; 10   es->f1p1  += (es->lf * (es->f1p0 - es->f1p1)); 11   es->f1p2  += (es->lf * (es->f1p1 - es->f1p2)); 12   es->f1p3  += (es->lf * (es->f1p2 - es->f1p3)); 13 
14   l          = es->f1p3; 15 
16   // Filter #2 (highpass)
17   
18   es->f2p0  += (es->hf * (sample   - es->f2p0)) + vsa; 19   es->f2p1  += (es->hf * (es->f2p0 - es->f2p1)); 20   es->f2p2  += (es->hf * (es->f2p1 - es->f2p2)); 21   es->f2p3  += (es->hf * (es->f2p2 - es->f2p3)); 22 
23   h          = es->sdm3 - es->f2p3; 24 
25   // Calculate midrange (signal - (low + high))
26 
27   m          = es->sdm3 - (h + l); 28 
29   // Scale, Combine and store
30 
31   l         *= es->lg; 32   m         *= es->mg; 33   h         *= es->hg; 34 
35   // Shuffle history buffer 
36 
37   es->sdm3   = es->sdm2; 38   es->sdm2   = es->sdm1; 39   es->sdm1   = sample; 40 
41   // Return result
42 
43   return(l + m + h); 44 }

其中,变量 vsa 是一个很小很小的常数,也可以不加。

4. 使用上述代码。

4.1 定义一个均衡器的全局变量:

      

EQSTATE eq;

4.2 初始化均衡器,假定采样率为48k:

set_3band_state(eq,880,5000,48000);

这样,你的均衡器的频段如下:

low band = 0Hz to 880Hz
mid band = 880Hz to 5000Hz
high band = 5000Hz to 24000Hz

4.3 设定提升参数:

1 eq.lg = 1.5; // Boost bass by 50%
2 eq.mg = 0.75; // Cut mid by 25%
3 eq.hg = 1.0; // Leave high band alone 

4.4 对每一个PCM样本,执行计算过程:

out_sample = do_3band(eq,in_sample);

 

上述代码仅仅是个很简单的均衡器。

在本人的项目当中,实现了更加精确高效的可商用均衡器,包括支持常用的采样率,更多高达31段的数字均衡器,并且可方便移植到任何嵌入式设备上的完整解决方案。

本文转载自:http://www.cnblogs.com/celerychen/archive/2013/03/09/2951276.html

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
怎么设计才能让一个音乐APP看起来够专业?

怎么设计才能让一个音乐APP看起来够专业? 优设-UISDC2017-11-0715 阅读 教程 所有人都热爱音乐。尼采也曾说过:“没有音乐,生活就会是个错误。”所以,不用争辩,音乐已经是我们生活中不可...

优设-UISDC
2017/11/07
0
0
Linux 下五款轻量级音乐播放器(开源)

本文介绍 Linux 系统下 5 款轻量级的音乐播放器。 YouAmp YouAmp 是一个小型和快速的音乐播放器,主要灵感来自 rhythmbox。 主要特点: 专辑歌手显示 last.fm 歌曲记录 支持播放增益 无间断回...

红薯
2010/12/20
21K
10
ubuntu另一個發行套件UbuntuStudio-數位影像媒体工作室

Ubuntu除Ubuntu基礎項目,還包括Kubuntu、Xubuntu和edubuntu。除此之外,Ubuntu社區自發開發了一個以针对GNU / Linux的音频,视频和图形专业及爱好者提供一個数字媒體工作室的套件,稱之為“...

李心陽 字(恪明)
2010/09/02
0
0
深度音乐

简介 深度音乐(英文名:Deepin Music)是deepin团队开发的一款美观易用的音乐播放器。 深度音乐使用基于GTK开发的Deepin UI开发,支持换肤功能,提供本地、在线音乐播放,支持音频格式转码和...

Hallucination
2014/01/15
2.6K
0
Xnoise 0.2.10 发布-增加了均衡器

Xnoise是一个轻量级的速度快而功能强大的音乐播放器,与hassle-free接口设计,音乐曲目(支持视频剪辑)按下一个按钮来管理和播放。 Xnoise简单的界面,允许用户作为默认的插件实现Ubuntu On...

oschina
2012/09/16
421
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

咕泡-Factory设计模式笔记

个人感悟: 设计模式都是处理复杂问题的,如果问题本身很简单,使用设计模式反而累赘,增加了开发的复杂性 遇到最简单的情况,直接 new 如果创建对象的过程简单,但是需要匹配不同情况,返回...

职业搬砖20年
18分钟前
0
0
Java中的锁分类

在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类。介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏...

Funcy1122
26分钟前
0
0
Ansible随机数

想为你的Ansible剧本取一个随机数?还想在接下来的运行中保持系统的等幂性?这里有一个答案。 假如,你要为一大批服务器设置cron任务,却不想让它们同时启动,你可以这样设置分钟数: minute...

大别阿郎
35分钟前
0
0
SpringCloud之服务注册中心Eureka

本系列介绍的配置均基于 Spring Boot 2.0.1.RELEASE 版本和 Spring Cloud Finchley.SR1 服务注册中心 Spring Cloud 已经帮我们实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。 ...

熊小飞呀
今天
9
1
“Comparison method violates ...”异常的再现方法

前提条件:JDK8 代码: import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class Test { public stat......

hunterli
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部