国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡單的聲音數據ADPCM壓縮方法

聚豐開發 ? 2019-01-11 18:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

| 聚豐開發方案開發設計及PCBA批量交付|

▼▼▼


前兩天有朋友發郵件給我,他有2~3k大小的圖像,想用AVR的單片機進行壓縮處理,看我有什么建議。


《刪繁就簡-單片機入門到精通》(我寫的~(#^.^#))一書中有一章節的內容和數據壓縮有關,我在網上也發布了相關的測試源代碼,這些代碼可以用做參考。


我們常使用的JPG圖片是一種效率較高的壓縮方法,在圖像細節沒有明顯失真的情況下可以達到10倍的壓縮率,不過這個10倍是針對尺寸比較大的圖像,對于小尺寸圖像并不適用。原因是通用的壓縮方法,都需要包含一個頭信息,頭信息會占用一定空間,這樣對于小尺寸圖像雖然圖像數據能有比較好的壓縮率,但加上頭信息最后得到的全部數據縮小的比率就有限。


越是壓縮率高的方法,其算法自然也越復雜,像這位朋友用的是AVR單片機,處理復雜算法的能力有限,幾年前我們用51的單片機測試過160*120大小的圖像,壓縮成JPG需要3~4秒的時間,完全不能滿足應用需求。(壓縮會比解壓縮更費時間)


除了圖像,聲音數據也常常需要進行壓縮處理
,不過聲音的壓縮處理方法和圖像會有所不同,大多是提取聲音數據的規律,用數學模型來模擬人喉嚨發聲,這種方法壓縮率高,但需要非常復雜的運算,也不適合低速的單片機用程序實現。


但有一種簡單的聲音壓縮方法例外,這種方法完全是基于被壓縮的數據分布特性,認為聲音數據是在0幅度上下正態分布,幅度越大的值出現的幾率越小,而且采樣所得的數據通常是平滑相連,出現上一點幅度為正最大而下一點幅度為負最小的可能性幾乎為零,兩點間的變化差異大都局限于一定范圍之內,于是將聲音數據處理相鄰兩點的變化值,從而起到壓縮效果,這樣處理的算法也比較簡單。

這里給大家介紹
一種簡單的ADPCM處理方法,是我以前在網上收集的。用這種方法實際上也可以用來處理前面圖像數據壓縮的問題,只是需要先將圖像數據預處理為RGB或YUV分量,然后進行壓縮處理


IMA-ADPCM 算法

-------------------------------------------------------


IMA-ADPCM (ADPCM Adaptive Differential Pulse Code Modulation), 是一種針對 16bit (或者更高?) 聲音波形數據的一種有損壓縮算法, 它將聲音流中每次采樣的 16bit 數據以 4bit 存儲, 所以壓縮比 1:4. 而壓縮/解壓縮算法非常的簡單, 所以是一種低空間消耗,高質量聲音獲得的好途徑. 著名的 WestWood 在它的許多游戲里都使用了這個技術, DUNE II, C&C, RA 等等, 保存聲音的數據文件后綴名為 .AUD 的大多用 IMA-ADPCM 壓縮. (不過 WestWood 的游戲數據文件大多經過打包, 這些小文件統統放進了一個 .MIX 文件包中, 關于解開 .MIX 文件包, 見http://www.geocities.com/SiliconValley/8682)


ADPCM 主要是針對連續的波形數據的, 保存的是波形的變化情況, 以達到描述整個波形的目的. 本文并不想詳細介紹 ADPCM 算法原理, 那些是數學知識,有高等數學基礎的朋友可以自己研究, 云風數學馬馬虎虎, 這里也講不清楚, 但是它的編碼和解碼的過程卻很簡潔, 列在后面, 相信大家能夠看明白.


先給不熟悉聲音信號的儲存的朋友補一課, 不想看就跳過吧 ^_^: 一般游戲中用到的聲音有兩種不同性質的, 一是波形數據, 是經過事先聲音采樣錄制下來的, 采樣時一般按每秒 8千到 4 萬次的頻率(8Khz ~44.4Khz)記錄每次采樣時的聲音強度, 在播放時, 再以同一頻率, 按樣本聲音的強弱變化觸發揚聲器, 聲音就被重現了, 如果你將采樣數據流標在坐標紙上,就會發現是一條波形曲線, 如果采樣時將聲音信號強弱分為 256 級, 就是我們說的 8bit 采樣, 如果分為 65536 級, 就是 16bit 采樣了; 另一是 MIDI 類的, 它是將各種樂器的聲學性質都事先記錄下來, 而數據流中仍舊是按一定頻率記錄, 但不是每秒數千上萬次了, 大約只有幾 Hz 到幾十 Hz, 將幾種樂器按某一音頻和強度觸發描述下來, 經過聲卡合成為波形信號就可以播放了.


8bit 采樣的聲音人耳是可以接受的, 比如 Win95 啟動的音樂, 而 16bit 采樣的聲音可以算是高音質了, 現代游戲中也多采用它. (將聲音強度分的更細沒有太多的意義, 通常都是提高采樣頻率來近一步提高音質) ADPCM 算法卻可以將每次采樣得到的 16bit 數據壓縮到 4bit ;-) 需要注意的是, 如果要壓縮/接壓縮立體聲信號, 請注意采樣時, 聲音信號是放在一起的, 需要將兩個聲道分別處理. OK, 下面列出了其中的奧妙, 請細細品味:


----------------------------------------------------------------


IMA-ADPCM 壓縮過程


首先我們認為聲音信號都是從零開始的,那么需要初始化兩個變量


int index="0",prev_sample:=0;


下面的循環將依次處理聲音數據流, 注意其中的 getnextsample() 應該得到一個 16bit 的采樣數據, 而 outputdata() 可以將計算出來的數據保存起來,程序中用到的 step_table[], index_adjust[] 附在后面:
int index="0",prev_sample:=0;


while (還有數據要處理) {
cur_sample=getnextsample(); // 得到當前的采樣數據
delta="cur"_sample-prev_sample; // 計算出和上一個的增量
if (delta<0) delta="-delta",sb=8;???
else sb="0"; // sb 保存的是符號位


code = 4*delta / step_table[index]; // 根據 steptable[] 得到一個 0~7 的值
if (code>7) code="7"; // 它描述了聲音強度的變化量


index+=index_adjust[code]; // 根據聲音強度調整下次取 steptable 的序號
if (index<0) index="0";??????????? // 便于下次得到更精確的變化量的描述
else if (index>88) index="88";


prev_sample=cur_sample;


outputode(code|sb); // 加上符號位保存起來
}


---------------------------------------------------------


IMA-ADPCM 解壓縮過程


接壓縮實際是壓縮的一個逆過程, 同樣其中的 getnextcode() 應該得到一個編碼, 而 outputsample() 可以將解碼出來的聲音信號保存起來. 這段代碼同樣使用了同一個的 setp_table[] 和 index_adjust() 附在后面:


int index="0",cur_sample:=0;


while (還有數據要處理) {
code="getnextcode"(); // 得到下一個數據


if ((code & 8) != 0) sb="1" else sb="0";
code&=7; // 將 code 分離為數據和符號


delta=(step_table[index]*code) /4 + step_table[index] / 8;
// 后面加的一項是為了減少誤差


if (sb==1) delta="-delta";


cur_Sample+=delta; // 計算出當前的波形數據
if (cur_sample>32767) cur_sample=32767;
else if (cur_sample<-32768) cur_sample:=-32768;


output_sample(cur_sample);


index+=index_adjust[code];
if (index<0) index="0";
if (index>88) index="88";
}




---------------------------------------------------------


附表


int index_adjust[8] = {-1,-1,-1,-1,2,4,6,8};


int step_table[89] = { 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552, 1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767 };



---------------------------------------------------------
關于 WestWood 的 .AUD 文件,結構比較簡單, 這里順帶提一下, 有興趣可以自己寫處理 AUD 文件的程序 ;-) 其 8bit 的聲音壓縮算法尚不知曉, 但用的最廣泛的 16bit 聲音正是用 IMA-ADPCM 壓縮, 每個 AUD 文件都有一個文件頭, 結構如下:


struct {
unsigned short int samplespersec; // 頻率
long int size; // 除掉文件頭的大小
long int outsize; // 輸出數據大小 (通常是 4 倍)
unsigned char flags; // 位 0 描述是否立體聲, 位 1 描述是否 16 bit
unsigned char type; // 1=WW 壓縮, 99=IMA ADPCM
}


AUD 文件的聲音信號是按塊存放的, 每塊大約 512 字節, 沒一塊都有一個塊頭結構:


struct {
unsigned short int size; // 壓縮過的數據大小
unsigned short int outsize; // 輸出數據大小 (通常是 4 倍)
long int id; // 永遠是 0x0000DEAF
}


---------------------------------------------------------
本文參考了 Vladan Bato 寫的 AUD 文件格式描述. 可以去他的網頁
http://www.geocities.com/SiliconValley/8682找到原文和他寫的 AUD,WAV 轉換程序.另外, Allegro 的愛好者可能想自己加入 AUD 的支持(Allegro 3.1 新增 Plug-In 支持, 增加新文件類型很方便), 不妨看看http://www.alphalink.com.au/~tjaden, 這里有完成了的 AUD 支持庫.
---------------------------------------------------------


聚豐開發網址:http://www.3532n.com/kf/

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 方案開發
    +關注

    關注

    0

    文章

    27

    瀏覽量

    2911
  • 電子開發者
    +關注

    關注

    0

    文章

    3

    瀏覽量

    3708
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何基于FFmpeg解碼ADPCM音頻

    在數字音頻的浩瀚星圖中,ADPCM是?顆低調卻恒久的星,它誕生于1970年代貝爾實驗室的走廊,見證了從電話交換機到 PlayStation 游戲機的滄桑變遷,如今依然在工業控制器的蜂鳴聲、監控錄像
    的頭像 發表于 01-27 16:39 ?679次閱讀
    如何基于FFmpeg解碼<b class='flag-5'>ADPCM</b>音頻

    【瑞薩RA6E2地奇星開發板試用】4、PWM模塊的音頻播放功能

    PWM模塊播放音頻,適合語音提示、簡單音效等對音質要求不高的應用,是成本敏感的嵌入式系統提供音頻解決方案 瑞薩RA6E2提供了PWM模塊的音頻播放功能。通過使用ADPCM模塊來解碼PCM數據。將該
    發表于 12-26 09:14

    linux的壓縮和解壓操作

    進行壓縮,然后傳輸壓縮的文件,這樣可以減少文件傳輸所需要的帶寬和時間,在網絡接收到文件之后再解壓,就可以得到文件了。 文件的壓縮有兩種方式:有損壓縮和無損
    發表于 12-23 06:56

    電能質量在線監測裝置數據壓縮對裝置性能有哪些影響?

    電能質量在線監測裝置的數據壓縮功能對性能的影響 總體可控且輕微 ,核心集中在「CPU 占用、內存消耗、存儲讀寫速度、數據傳輸延遲」四大維度,且通過廠商優化(硬件加速、算法選型、資源調度)可將負面影響
    的頭像 發表于 12-17 10:28 ?338次閱讀
    電能質量在線監測裝置<b class='flag-5'>數據壓縮</b>對裝置性能有哪些影響?

    如何配置電能質量在線監測裝置的數據壓縮存儲功能?

    現代電能質量在線監測裝置普遍支持數據壓縮存儲,可顯著節省存儲空間 (2-20 倍) 和傳輸流量。配置步驟如下: 一、配置前準備 1. 確認裝置支持情況 高端裝置 (電網側):標配硬件壓縮模塊
    的頭像 發表于 12-17 10:26 ?490次閱讀
    如何配置電能質量在線監測裝置的<b class='flag-5'>數據壓縮</b>存儲功能?

    電能質量在線監測裝置支持哪些數據壓縮算法?

    電能質量在線監測裝置支持 無損壓縮 和 有損壓縮 兩大類算法,適配不同數據類型(實時數據、歷史數據、波形
    的頭像 發表于 12-12 14:08 ?450次閱讀
    電能質量在線監測裝置支持哪些<b class='flag-5'>數據壓縮</b>算法?

    電能質量在線監測裝置的數據壓縮存儲功能對數據傳輸速度的影響有多大?

    電能質量在線監測裝置的數據壓縮存儲功能對數據傳輸速度的影響,可通過 量化對比 + 場景拆解 明確: 絕大多數場景下傳輸速度提升 50%~80%(低帶寬場景甚至超 90%),僅軟件壓縮的小文件傳輸或
    的頭像 發表于 12-11 16:45 ?1286次閱讀
    電能質量在線監測裝置的<b class='flag-5'>數據壓縮</b>存儲功能對<b class='flag-5'>數據</b>傳輸速度的影響有多大?

    電能質量在線監測裝置的數據壓縮存儲功能對數據傳輸速度有影響嗎?

    電能質量在線監測裝置的數據壓縮存儲功能對數據傳輸速度的影響是 “雙刃劍” : 核心正面影響: 壓縮數據量減小,大幅降低傳輸帶寬需求,縮短傳輸時間 (尤其適用于大文件如暫態錄波、歷史
    的頭像 發表于 12-11 16:43 ?1243次閱讀
    電能質量在線監測裝置的<b class='flag-5'>數據壓縮</b>存儲功能對<b class='flag-5'>數據</b>傳輸速度有影響嗎?

    電能質量在線監測裝置的數據壓縮存儲功能支持的數據格式可以修改嗎?

    電能質量在線監測裝置的數據壓縮存儲功能支持的數據格式 部分可修改 ,具體取決于格式類型(數據文件格式 / 壓縮算法格式)與廠家設計,核心結論如下: 一、
    的頭像 發表于 12-11 16:39 ?1094次閱讀
    電能質量在線監測裝置的<b class='flag-5'>數據壓縮</b>存儲功能支持的<b class='flag-5'>數據</b>格式可以修改嗎?

    應用于暫態波形存儲的數據壓縮算法需要考慮哪些因素?

    應用于暫態波形存儲的數據壓縮算法,需圍繞 暫態波形特性 (突變性、關鍵特征依賴性)、 工業場景需求 (實時性、硬件限制)及 數據應用價值 (故障溯源、合規性)綜合考量,核心需關注以下六大維度: 一
    的頭像 發表于 11-05 15:02 ?322次閱讀

    如何進行聲音定位?

    文章主要介紹了如何利用一種簡單的TDOA算法進行聲音點位,并使用數據采集卡進行聲音定位的實驗。
    的頭像 發表于 09-23 15:47 ?1812次閱讀
    如何進行<b class='flag-5'>聲音</b>定位?

    氫氣壓縮機PLC數據采集系統解決方案

    ,包括啟停、轉速、壓力、溫度、流量等,確保設備安全穩定運行。 然而,隨著生產規模的擴大和智能化管理需求的提升,企業面臨著數據孤島、遠程監控不足、故障預警滯后等挑戰。為解決這些問題,物通博聯提供基于PLC智能網關的壓縮
    的頭像 發表于 08-15 17:15 ?885次閱讀
    氫氣<b class='flag-5'>壓縮</b>機PLC<b class='flag-5'>數據</b>采集系統解決方案

    聲源定位模塊-AR1105# 聲源定位# 聲音定位

    聲音降噪
    深圳市聲訊電子有限公司
    發布于 :2025年08月01日 16:01:09

    低內存場景下的高效壓縮利器:FastLZ壓縮庫應用實踐指南

    聯網設備等場景的嚴苛需求。 FastLZ ——是一款高效且小巧的開源壓縮庫,主要用于實現基于LZ77算法的字節對齊數據壓縮。LZ77(Lempel-Ziv 1977)是數據壓縮領域的一種經典
    的頭像 發表于 07-22 15:13 ?375次閱讀
    低內存場景下的高效<b class='flag-5'>壓縮</b>利器:FastLZ<b class='flag-5'>壓縮</b>庫應用實踐指南

    諧波怎么處理最簡單方法

    諧波問題是電力系統中常見的電能質量問題,它不僅影響設備正常運行,還可能造成能源浪費和設備損壞。針對諧波處理的最簡單方法,我們可以從以下幾個方面入手: 一、理解諧波產生的原因 諧波主要由非線性負載產生
    的頭像 發表于 07-13 16:35 ?3443次閱讀
    諧波怎么處理最<b class='flag-5'>簡單</b>的<b class='flag-5'>方法</b>