STM32的音频编码与在PC端的解码

STM32的音频编码与在PC端的解码

  • 简介
  • STM32F4移植
    • 编码
  • 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移植

STM32的音频编码与在PC端的解码_第1张图片
文件不多,都在库里,自行查找
在这里插入图片描述
头文件位置

增加宏定义 HAVE_CONFIG_H

增大Heap_Size为0x8000

STM32的音频编码与在PC端的解码_第2张图片
修改内存分配函数(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移植

STM32的音频编码与在PC端的解码_第3张图片
STM32的音频编码与在PC端的解码_第4张图片
STM32的音频编码与在PC端的解码_第5张图片
主要是有关修改的地方
使用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的代码。希望大家自己多试试。

你可能感兴趣的:(有关STM32的一些东西)