你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

PWM +WAV +FLASH

[复制链接]
xueshawu1 提问时间:2017-6-15 11:39 /
悬赏1ST金币未解决
目前,需要做个功能 读取fllash中的语音文件,然后利用PWM播放出来;
现在我面临以前几个 问题
1、FLASH只有1M,我已经 存了字库了大概750kb;剩下的已经不多了(我需要的也就几句话,先搞一句话,空间的问题后面再说)
2、WAV如何导入到flash中 ;(需要把非语音字节去掉在导入,还是直接把WAV文件直接通过修改后缀的方式改成 BIN文件然后才导入)(我打算用 串口接收,然后写入到flash中)
3、我用 朗读女生成了我需要放出来的那几个字,但是看不到采样级别(我的电脑是WIN10 系统)
1.png



收藏 评论15 发布时间:2017-6-15 11:39

举报

15个回答
xueshawu1 回答时间:2017-6-15 11:41:36
说实话,一头雾水,网上 好多都是SD的方式;
adlu 回答时间:2017-6-15 14:07:59
1.如果存储空间不够,可以将wav文件转换成8k采样率8bit深度单声道文件,下个GoldWave软件即可。
250k字节空间,对8k/8bit/mono文件,可以存储约32秒音频。
2.可直接将wav文件写入flash中,但读取的时候,按照wav的格式,去掉头部即可,一般是前44字节。
播放时,每1/8k秒读取一个字节并输出到PWM上。如果可以,建议把PWM输出改为DAC输出,音效会更好。
3.用GoldWave打开文件即可看出文件的采样率和位宽等信息。
xueshawu1 回答时间:2017-6-15 16:56:59
adlu 发表于 2017-6-15 14:07
1.如果存储空间不够,可以将wav文件转换成8k采样率8bit深度单声道文件,下个GoldWave软件即可。
250k字节空 ...

非常感谢;我就先去动手了;
不过,我还有个想法;因为我需要的语句并不多,只有几条;后面导入不可能单独导入,肯定是要做成一个文件去导入;我打算,把所有单独的语音文件,去掉前面的格式块的数据,将数据整合起来;如果能行,尽量做到一条语音占据一个page(或者是sector,这样的整个地址);这样通过地址偏移就能准确调用每一个想要的语音包
xueshawu1 回答时间:2017-6-15 17:00:00
adlu 发表于 2017-6-15 14:07
1.如果存储空间不够,可以将wav文件转换成8k采样率8bit深度单声道文件,下个GoldWave软件即可。
250k字节空 ...

另外,PWM占空比如何通过当前数据来计算呢
xueshawu1 回答时间:2017-6-15 17:00:56
xueshawu1 发表于 2017-6-15 16:56
非常感谢;我就先去动手了;
不过,我还有个想法;因为我需要的语句并不多,只有几条;后面导入不可能单 ...

去掉WAV格式数据,是因为我懒得解析
xueshawu1 回答时间:2017-6-15 17:06:56
8位量化的脉冲宽度为:音频数据/255*pwm周期

PWM占空比是这样计算么
adlu 回答时间:2017-6-16 09:12:49
xueshawu1 发表于 2017-6-15 17:06
8位量化的脉冲宽度为:音频数据/255*pwm周期

PWM占空比是这样计算么

差不多就这意思。
你把PWM理解成DAC就行了。
xueshawu1 回答时间:2017-6-16 10:52:32
adlu 发表于 2017-6-16 09:12
差不多就这意思。
你把PWM理解成DAC就行了。

应该是这样吧,16位数据相当于转换精度,ARR的值相当于基准电压;
data/(0xFFFF)*ARR;最后得到一个比较值,与ARR比较,产生占空比
xueshawu1 回答时间:2017-6-18 14:27:20
adlu 发表于 2017-6-16 09:12
差不多就这意思。
你把PWM理解成DAC就行了。

可能还是哪里有问题;语音输出一直是杂波; 我一共试了三种采样率的WAV文件;
这个代码是11K 8位数据的WAV文件,红色部分是转换到CCR1寄存器的写入值;


//PWM WAV配置----TIM1 --CH1
void Speak_Init(void)
{

TIM_TimeBaseInitTypeDef   TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef     TIM_OCInitStructure;
GPIO_InitTypeDef     GPIO_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOA.8
GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_2);  //GPIO_AF_2

//wav采样率 24KHz = 48000KHz/(999+1)(1+1);
//      16KHz = 48000KHz/(999+1)(2+1)
  //          11KHz  = 48000KHz/(2180+1)(1+1)
TIM_TimeBaseInitStructure.TIM_ClockDivision  = TIM_CKD_DIV1;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
//TIM_TimeBaseInitStructure.TIM_Period = 999;
// TIM_TimeBaseInitStructure.TIM_Prescaler = 2; //16K
TIM_TimeBaseInitStructure.TIM_Period = 2180;
TIM_TimeBaseInitStructure.TIM_Prescaler = 1;  //11K
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM_OCInitStructure.TIM_Pulse = 500;  //测试

TIM_OC1Init(TIM1,&TIM_OCInitStructure);//TIM1--CH1
TIM_Cmd(TIM1,ENABLE);
TIM_CtrlPWMOutputs(TIM1,ENABLE);//
}
uint8_t Speak_Buffer[1024];// 1KB为单位读取
void Speak_DataSet(uint8_t data)
{

uint16_t  speak_data;
speak_data = (data*2180)/255; //--8位数据
//printf("\r\n %d",speak_data);
TIM1->CCR1 = speak_data;
}
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版