硬件——STM32 , 錄音,wav


詳細的wav頭文件解析,有例子:http://www.cnblogs.com/chulin/p/8918957.html

 

關於錄音程序的編寫:

我的思路是改寫原子的程序,原子的程序需要借助VS1053 (這是一個語音芯片)來實現錄音,

麥克風連接在VS1053 (這是一個語音芯片)芯片上,麥克風采集的聲音電壓會經過語音芯片處理存入語音芯片特定的寄存器中

,用stm32從那個語音芯片的寄存器里讀音頻數據,並通過FATFS文件系統制作WAV文件頭,把數據存入文件頭下就可以了.即:

生成最終的WAV文件.  一個文件其實就是由一個文件頭和數據組成, 機器通過解讀文件頭,來按照文件頭指定的方式讀取數據,

 

 

我現在的工作是去掉這顆語音芯片,,用ADC來替代語音芯片的功能,,麥克風接在ADC的引腳上,,把聲音電壓采集出來,存到數組

或鏈表中,,,完成WAV文件的制作

 

步驟:

1,制作出一個音符的WAV文件,不通過ADC,直接用數組建出來, 調整音量大小

2,通過ADC進行聲音采樣,涉及到  "存"  和  "采"  兩個過程,單片機每次只能做一件事,如何協調這兩個的關系..

 

 

下面是用UltraEdit軟件,打開WAV文件之后的截圖:

 

    

 

 

分析一下上面兩張圖,,,找不同

代碼部分WAV文件頭如下::

//wav頭
typedef __packed struct   //關於結構體我用的還是很不熟練,,,,需要提升這部分,,,,這個是結構體的定義,定義在了.h文件中,,,,
                             //上面一大堆也是結構體,,,  其實這個結構體的元素也都是結構體,,,是結構體套結構體的...    
{
    ChunkRIFF riff;    //riff塊
    ChunkFMT fmt;      //fmt塊
    //ChunkFACT fact;    //fact塊 線性PCM,沒有這個結構體,此次試驗我們也不打算考慮這部分..   
    ChunkDATA data;    //data塊        
}__WaveHeader;

 

把上面WAV頭的每個元素找出來

每個元素都是chunk結構:即

 

 //RIFF塊
typedef __packed struct
{
    u32 ChunkID;                     //chunk id;這里固定為"RIFF",即0X46464952   (這個就是4bytes,,即4個ASCII碼,,,bytes,,,,1byte=8bit  也就是一個字節是8位)  查看圖片上的前四個:52  49  46  46
    u32 ChunkSize ;               //集合大小;文件總大小-8         這部分也是占固定的4bytes  0X24  DA  04 00 =317988約310K       0X24   84  03  00=230436約225K
    u32 Format;                     //格式;WAVE,即0X45 56 41 57
}ChunkRIFF ;

 

 

//fmt塊
typedef __packed struct
{
    u32 ChunkID;               //chunk id;這里固定為"fmt ",即0X20746D66     66 6D  74  20
    u32 ChunkSize ;               //子集合大小(不包括ID和Size);這里為: 接下來4個字節是:     10 00 00 00 在這里表示 01,

                                           //也就是16個字節  :01 00 02 00 80 BB 00 00 00 EE 02 00 04 00 10 00

                                          //紅色標注的數字,分別分配到下面:


    u16 AudioFormat;          //音頻格式;0X01,表示線性PCM;0X11表示IMA ADPCM     01 00 pcm格式
    u16 NumOfChannels;        //通道數量;1,表示單聲道;2,表示雙聲道;   02 00  雙聲道
    u32 SampleRate;            //采樣率;0X1F40,表示8Khz  80 BB 00 00=4800                           這個是采樣率,能不能根據采樣率,來計算定時器需要如何設定 如果我們設定的采樣率是8000Hz即8KHz,,,那么也就是每秒8000次,,,,也就是0.000125s采集一次...125us一次中斷采集....剩下就是配置定時器中斷了
    u32 ByteRate;            //字節速率;   00 EE 02 00=750
    u16 BlockAlign;            //塊對齊(字節);  04 00
    u16 BitsPerSample;        //單個采樣數據大小;4位ADPCM,設置為4   10 00=16
//    u16 ByteExtraData;        //附加的數據字節;2個; 線性PCM,沒有這個參數
//    u16 ExtraData;            //附加的數據,單個采樣數據塊大小;0X1F9:505字節  線性PCM,沒有這個參數
}ChunkFMT;   

 

 

最后一張圖:網上得來:http://blog.csdn.net/gwhcsdn/article/details/70964342

 

 根據上圖的實例分析:

 

 

正點原子文檔的主要部分在:recorder.c中

 

 

 

參考的<<STM32開發指南V1.0庫函數版本>>

 

ALIENTEK 戰艦 STM32 開發板板載的 VS1053 (這是一個語音芯片)支持 2 種格式的 WAV 錄音:

PCM 格式或者 IMA ADPCM 格式, 其中 PCM(脈沖編碼調制) 是最基本的 WAVE 文件格式,這種文件直
接存儲采樣的聲音數據沒有經過任何的壓縮。而 IAM ADPCM 則是使用了壓縮算法,壓縮比率
4:1 .

 

本章,我們主要討論 PCM,因為這個最簡單。我們將利用 VS1053 實現 16 位, 8Khz
樣率的單聲道 WAV 錄音(PCM 格式)要想實現 WAV 錄音得先了解一下 WAV 文件的格式,
WAVE 文件是由若干個 Chunk 組成的。按照在文件中的出現位置包括: RIFF WAVE Chunk
Format ChunkFact Chunk(可選)Data Chunk。每個 Chunk 由塊標識符、數據大小和數
據三部分組成,如圖 50.1.1 所示:

 

上圖是每個chunk塊都要遵守的結構.

其中塊標識符由 4 ASCII 碼構成,數據大小則標出緊跟其后的數據的長度(單位為字節),
注意這個長度不包含塊標識符和數據大小的長度,即不包含最前面的 8 個字節。所以實際 Chunk
的大小為數據大小加 8

 

 

 

 

 

 

 

通過以上學習,我們對 WAVE 文件有了個大概了解。接下來,我們看看如何使用 VS1053

實現 WAVPCM 格式)錄音。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM