Lora sx1278+stm32(ADC录音)+SPPEX音频压缩 数字对讲机
原型机实现基本功能;
录音代码:
void adc_half(void)
{if(page_index<page_length){for(x=0;x<DMA_size/2-1;x++){wave_buffer_a[wavIndex]=adc_val[x]*255/4096;wavIndex+=1;}}else{record_flag=3;printf("record to end\r\n");}}
void adc_all(void)
{
// uint16_t temp;if(page_index<page_length){for(x=DMA_size/2-1;x<DMA_size-1;x++){wave_buffer_a[wavIndex]=adc_val[x]*255/4096;wavIndex+=1;}
// EncodeB();wavIndex=0;Audio_write();}else{record_flag=3;printf("record to end\r\n");}}void record_pdm(void)
{if(record_flag==1){if(buff_flag==3){ page_index=0; page_length=40; HAL_TIM_Base_Start(&htim3);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
// __HAL_DMA_ENABLE_IT(hdma_adc1, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));HAL_ADC_Start_DMA(&hadc1, (uint32_t *)(&adc_val), DMA_size);HAL_ADCEx_Calibration_Start(&hadc1);wavIndex=0;buff_flag=0;}}if(record_flag==3){ record_flag =0;
// HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1);HAL_TIM_Base_Stop_IT(&htim3); HAL_ADC_Stop_DMA(&hadc1);printf("record to end\r\n");page_length=page_index;lora_send_init();}}
void Audio_write(void)
{U8_U64();writeFlash(page_index);page_index++;}void U8_U64(void){int i;for(i=0;i<wave_buffer_size/4;i++){WriteBuffer[i]=wave_buffer_a[i*4+3];WriteBuffer[i]=WriteBuffer[i]|wave_buffer_a[i*4+2]<<8;WriteBuffer[i]=WriteBuffer[i]|wave_buffer_a[i*4+1]<<16;WriteBuffer[i]=WriteBuffer[i]|wave_buffer_a[i*4]<<24;}
}
播音代码
void audio_PCM(void)
{ if(play_flag ==1){if(buff_flag==3){ page_index=0;write_flag=0;Audio_read();page_index++; write_flag=1;Audio_read();page_index++; buff_flag=0;start_addr=0x0800F000;HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);HAL_TIM_Base_Start_IT(&htim1); }if(buff_flag==1){ buff_flag=0;Audio_read(); page_index++;if(page_index>page_length){play_flag=3;}}}if(play_flag==3){play_flag =0;cont=0;TIM4->CCR1=0;HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_1); HAL_TIM_Base_Stop_IT(&htim1);
// HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); printf("play to end \r\n");}}void Audio_read(void){int i=0;for(i=0;i<wave_buffer_size/4;i++){WriteBuffer[i]=readFlash(start_addr)<<16|readFlash(start_addr+2);start_addr+=4;}U64_U8();
}void U64_U8(void){int i=0;if(write_flag==1){for(i=0;i<wave_buffer_size/4;i++){ wave_buffer_b[i*4]=WriteBuffer[i]>>16;wave_buffer_b[i*4+1]=WriteBuffer[i]>>24;wave_buffer_b[i*4+2]=WriteBuffer[i];wave_buffer_b[i*4+3]=WriteBuffer[i]>>8;}}else{for(i=0;i<wave_buffer_size/4;i++){wave_buffer_a[i*4]=WriteBuffer[i]>>16;wave_buffer_a[i*4+1]=WriteBuffer[i]>>24;wave_buffer_a[i*4+2]=WriteBuffer[i];wave_buffer_a[i*4+3]=WriteBuffer[i]>>8;}}}
lora处理函数
void Ebyte_Port_ReceiveCallback( uint16e_t state, uint8e_t* buffer, uint8e_t length )
{if( state &= 0x0001 ){int i;if(buffer[0]=='r'){start_flag=1;end_flag=1;for(i=0;i<13;i++){if(buffer[i]!=head_start[i])start_flag=0;}for(i=0;i<13;i++){if(buffer[i]!=head_stop[i])end_flag=0;}}if(start_flag==1){start_flag=0;printf("start to recieve\r\n");page_index=0; }if(end_flag==1){page_length=page_index;end_flag=0;play_flag=1; record_flag=0;buff_flag=3;printf("start to play\r\n");}for(i=0;i<length;i++,buffer++){wave_buffer_a[write_cont]=*buffer;if(write_cont>wave_buffer_size){write_cont=0;if(page_index<40){Audio_write();}}else{write_cont++;}}E32x_GoReceive();SPI_select=1;}}
样机测试发现如下缺陷,待优化提升:
提升lora传输速率(扩频,频宽调制)时,通话距离下降严重;
使用的STM32F103C8T6内存不足,运行SPEEX后内存经常溢出;
使用8KHz采样率,音质差强人意。
源代码下载链接:
https://download.csdn.net/download/qiang129/85163421
Lora sx1278+stm32(ADC录音)+SPPEX音频压缩 数字对讲机相关推荐
- [语音录制与播放]stm32+adc+dac
2020-12-13更新: 最近总有人私信我要原理图和代码,贴一下我的公众号吧,有问题可以到这里联系我:[Golang梦工厂],下方点击联系人即可添加我的个人vx(建了一个语音录制交流群,加我VX拉你 ...
- LoRa SX1278通信代码开发学习
前言 最近在学习和摸索LoRa SX1278无线发射模块,其中学到了很多新知识和对SX1278也有了深一点的认识,现在将学习开发中遇到的问题.解决方法.调试完成和低功耗等内容分享出来,也是一种学习记录 ...
- 音频压缩的方法有哪些?三个方法介绍给你
不知道大家有没有跟我一样的烦恼,手机内存总是不够用,反复清理了又再清理,到最后还是留下了一些重要的文件不能删除,但是换手机一来觉得贵二来文件传输来传输去也怕损坏.目前我的手机里存放的最多的就是开会时候 ...
- Java实现音频格式转换 WAV---mp3,可使音频压缩
最近做的一个小项目中,师兄安排的任务,要实现录音然后保存文件,实现网络传输,然后我用初学的java实现了一个录音机的功能(见前面的博客),但是windows录音默认保存的格式是WAVE,后缀是WAV, ...
- STM32——ADC模数转换器
文章目录 一.ADC模数转化器 ADC简介 逐次逼近型ADC ADC框图 二.ADC基本结构 三.触发转换控制 四.输入通道 五.规则组的四种转换模式 单次转换,非扫描模式 连续转换,非扫描模式 单次 ...
- STM32 ADC 同步规则模式 ADC1与ADC2同用一个DMA
STM32 ADC 支持同步规则模式 ,其官方解释为: 大致意思就是通道组的 ADC1 的多路开关(由 ADC1_CTLR2寄存器的 ETSRC[2:0]决定), ADC2 被同步触发.在 ADC1 ...
- STM32 ADC 采样 频率的确定
一 STM32 ADC 采样频率的确定 1. : 先看一些资料,确定一下ADC 的时钟: (1),由时钟控制器提供的ADCCLK 时钟和PCLK2(APB2 时钟)同步.CLK 控制器为A ...
- STM32 ADC转换实验
摘自:STM32 ADC转换实验 作者:追兮兮 发布时间: 2020-10-29 09:42:24 网址:https://blog.csdn.net/weixin_44234294/article/d ...
- STM32——ADC
STM32--ADC 宗旨:技术的学习是有限的,分享的精神是无限的. 一.ADC指标 有 18 个通道,可测量 16 个外部和 2 个内部信号源.各通道的 A/D 转换可以单次.连续.扫描或间断模式执 ...
- STM32 ADC模数转换
STM32 ADC模数转换 独立模式/双重DMA/三重DMA //使能ADC时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //APB2 ...
最新文章
- RDKit | 基于多片段的分子生成(骨架A+骨架B+骨架C)
- 前端基础知识 - 收藏集 - 掘金
- spring 调用python_Spring http服务远程调用实现过程解析
- java如何用键盘输入_java中如何从键盘输入(附代码)
- 01_13_JSP编译指令
- 【Kafka】Kafka如何开启SSL 控制台消费与生产 代码消费与生产
- [转载] 【Python】Python3 List copy()方法
- java毕业设计开题报告javaweb户籍管理系统|户口
- XWPFTemplate生成根据模板文件填充内容生成word文件
- 单件模式(Singleton Pattern
- java modifier access_Java Modifier.getAccessSpecifier方法代码示例
- 美术基础——角色设计
- Refseq : accession id to taxonomy lineage.
- 联想小新 Air 13 (Pro) 6,7代笔记本安装Win7系统
- Anaconda各个版本清华镜像站下载
- java中的toArray()
- 从0了解矩阵——矩阵的本质
- 【DEVOPS】基于禅道 - 重构研发协作流程
- c语言程序设计第二版(张磊),C语言程序设计教程(第2版) 教学课件 张磊 第9章 文件程序设计.pdf...
- js-高德地图规划路线