STM32的音訊編碼與在PC端的解碼
阿新 • • 發佈:2018-12-15
STM32的音訊編碼與在PC端的解碼
簡介
能看到這篇文章的基本上都是有迫切需求的人,話不多說,切入正題
編解碼庫:Speex
編碼硬體平臺:STM32F411——Cortex-M4
編碼開發環境SDK:STM32CubeMX5.0.0 + Keil 5.26.2
解碼平臺:PC機
解碼開發環境SDK:Visual Studio 2017(v141)——WSDK:10.0.17763.0
首先要說明一點,這個例項所使用的不是官網提供的源生Speex庫,而是STM32官方提供的庫,但是這個庫是在2009年編寫的,下載地址找不到了,但是有文件
ST官方文件:AN2812
我將此庫下載地址放到CSDN上
https://download.csdn.net/download/weixin_41738734/10851597
STM32F4移植
檔案不多,都在庫裡,自行查詢
標頭檔案位置
增加巨集定義 HAVE_CONFIG_H
增大Heap_Size為0x8000
修改記憶體分配函式(os_support.h)
修改完畢後就可正常使用了。
編碼
初始化:
SpeexBits bits;/* Holds bits so they can be read and written by the Speex routines */
void *enc_state, *dec_state;/* Holds the states of the encoder & the decoder */
int quality = 4, complexity=1, vbr=0, enh=1;/* SPEEX PARAMETERS, MUST REMAINED UNCHANGED */
int frame_size;
void Speex_Init(void)
{
/* Speex encoding initializations */
speex_bits_init(&bits);
enc_state = speex_encoder_init (&speex_nb_mode);
speex_encoder_ctl(enc_state, SPEEX_SET_VBR, &vbr);
speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY,&quality);
speex_encoder_ctl(enc_state, SPEEX_SET_COMPLEXITY, &complexity);
speex_encoder_ctl(enc_state,SPEEX_GET_SAMPLING_RATE,&frame_size);
/* speex decoding intilalization */
dec_state = speex_decoder_init(&speex_nb_mode);
speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh);
}
編碼方式1:
speex_bits_reset(&bits);
/* Encode the frame */
speex_encode_int(enc_state, (spx_int16_t*)&rdata[rdata_len], &bits);
/* Copy the bits to an array of char that can be decoded */
speex_bits_write(&bits, (char *)&recoder_outdata[recoder_out_data_loc], ENCODED_FRAME_SIZE);
編碼方式2:
speex_bits_reset(&bits);
/* Encode the frame */
while(i--)
speex_encode_int(enc_state, (spx_int16_t*)&rdata[rdata_len], &bits);
/* Copy the bits to an array of char that can be decoded */
speex_bits_write(&bits, (char *)&recoder_outdata[recoder_out_data_loc], ENCODED_FRAME_SIZE);
PC移植
主要是有關修改的地方
使用CTRL+H替換功能 將所有函式名前面的EXPORT刪除
初始化程式碼相同不再多說
解碼
/* Copy the encoded data into the bit-stream struct */
speex_bits_read_from(&bits, (char*)&fin_ptr[read_loc], 20);
/* Decode the data */
speex_decode_int(dec_state, &bits, (spx_int16_t *)out);
結尾
程式碼驗證過。沒有問題,並經過迴環測試(STM32壓縮並記錄到SD卡上,在PC端進行還原),但是由於工作原因,不能放出STM32的程式碼。希望大家自己多試試。