日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数字音乐均衡器

發布時間:2023/12/29 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数字音乐均衡器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很多音樂播放軟件都有均衡器,例如千千靜聽的數字均衡器效果如下:

這是一個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段的數字均衡器,并且可方便移植到任何嵌入式設備上的完整解決方案。

轉載于:https://my.oschina.net/abcijkxyz/blog/792336

總結

以上是生活随笔為你收集整理的数字音乐均衡器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。