1. 程式人生 > >STM32的音訊編碼與在PC端的解碼

STM32的音訊編碼與在PC端的解碼

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的程式碼。希望大家自己多試試。