OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5556|回复: 22

网上找的Speex工程文件(MDK),在STM32F103RE上能输出语音

[复制链接]

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
发表于 2016-1-20 16:33:36 | 显示全部楼层 |阅读模式
刚开始调不通,后来设置了.S文件的堆和栈的大小,能够输出一段英文语音了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-27 23:27:50 | 显示全部楼层
在STM32F103C8上第一第二个演示可以第三第四个闪存太小了。若是在stm32f10x_it.c那里做个插值也许输出滤波简单些,音质会好些

    现在摸索到codec2 去了,codec2 也是个开源的声码器。codec2好像是浮点数的的,STM32F103跑不了。
codec2.C里面有这么一段子:
      /*---------------------------------------------------------------------------*\

  FUNCTION....: codec2_encode_2400
  AUTHOR......: David Rowe
  DATE CREATED: 21/8/2010

  编码160语音样本(话音为20ms)转换成48位。

  该codec2算法实际操作内部上 10ms (80
  样本)帧,所以我们进行编码算法的两倍。在
  第一帧,我们只是把清浊位。在第二帧我们
  把所有的模型参数。

  比特分配是:

   参数                      bits/帧
    --------------------------------------
    谐波幅值 (LSPs)                             36
    Joint VQ of Energy and Wo       8
    Voicing (10ms 更新)           2
    Spare                           2
    TOTAL                          48

\*---------------------------------------------------------------------------*/
/////////////////////////////////////////////////////////////////////////////////////////

/*---------------------------------------------------------------------------*\

  FUNCTION....: codec2_encode_1600
  AUTHOR......: David Rowe
  DATE CREATED: Feb 28 2013

  编码320语音样本(讲话40毫秒)到64位。

  该codec2算法实际上在内部运行在10毫秒 (80
  样品)帧,所以我们进行编码算法4次:

  frame 0: voicing bit
  frame 1: voicing bit, Wo and E
  frame 2: voicing bit
  frame 3: voicing bit, Wo and E, scalar LSPs

  该 bit 分配是:

    Parameter                      frame 2  frame 4   Total
    -------------------------------------------------------
    Harmonic magnitudes (LSPs)      0       36        36
    Pitch (Wo)                      7        7        14
    Energy                          5        5        10
    Voicing (10ms update)           2        2         4
    TOTAL                          14       50        64

\*---------------------------------------------------------------------------*/
回复 支持 1 反对 0

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-1-20 17:17:40 | 显示全部楼层
解码还行,编码有点累。
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-20 17:22:41 | 显示全部楼层
aozima 发表于 2016-1-20 17:17
解码还行,编码有点累。

不知道speex版本之间有没有很大差异。
公司用的声码器不容易做到跨平台,想多了解下speex、Vorbis ogg之类的技术。
回复 支持 反对

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3722
金钱
3722
注册时间
2011-5-23
在线时间
2013 小时
发表于 2016-1-20 18:48:08 | 显示全部楼层
有源代码的东西还怕版本差异?
RT-Thread RTOS 音频,WIFI,蓝牙
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-23 15:48:04 | 显示全部楼层
我也下载有,之前在STM32F103C8上试过运行不了,连晶振两端都没有电压,后把它改成3.5的厍外,晶振起振了,可是到初始化解码时通不过
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-23 15:58:10 | 显示全部楼层
EXPORT void *speex_decoder_init(const SpeexMode *mode)
{
   return mode->dec_init(mode);       
                                                                        }
/////////////////////////////////////////////////////////
void *nb_decoder_init(const SpeexMode *m)
{
   DecState *st;
   const SpeexNBMode *mode;
   int i;

   mode=(const SpeexNBMode*)m->mode;
   st = (DecState *)speex_alloc(sizeof(DecState));//解码初始化第二步跳到这里,之后跳到os_support.h 56行
   if (!st)
      return NULL;
#if defined(VAR_ARRAYS) || defined (USE_ALLOCA)
   st->stack = NULL;
///////////////////////////////
/** Speex的包装释放calloc。 做你自己的动态分配,所有你需要做的就是替换这个功能,Speex语音的realloc和 speex_free
    注:speex_alloc需要清除内存 */
#ifndef OVERRIDE_SPEEX_ALLOC
static inline void *speex_alloc (int size)
{
   /* 警告: 这不等同于malloc()函数。如果你想用malloc()
      或者你自己的分配器,需要明确分配的内存。 除此以外
      你会碰到一些奇怪的错误 */
   return calloc(size,1);
}
#endif
/////////////////////////////////////////////////////////
EXPORT int speex_decoder_ctl(void *state, int request, void *ptr)
{
   return (*((SpeexMode**)state))->dec_ctl(state, request, ptr);//解码初始化到这行后出现硬件异常
}
/////////////////////////
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-23 16:03:50 | 显示全部楼层
若编码录音没问题,就是播放不了。
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-25 10:35:04 | 显示全部楼层
STM129 发表于 2016-1-23 16:03
若编码录音没问题,就是播放不了。

我也遇到过初始化不通过的情况,修改了.s启动文件后就好了。
STACK 设置为0x10000
HEAP 设置为0x800
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-25 15:21:11 | 显示全部楼层
楼主的是外架SRAM的吧
改了还是不行,编译提示:
\ OBJ\的Speex语音编码STM32F103-STK.axf:错误:L6406E:在执行区.ANY选择匹配startup_stm32f10x_md.o(栈)没有空间。
\ OBJ\ SpeexVocoder_STM32F103-STK.axf:错误:L6407E:聚集体尺寸段的0x10000字节不能融入.ANY选择(S)。
STACK 设置为0x8000也试过。
    楼主的是外架SRAM的吧
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-25 15:42:05 | 显示全部楼层
要选用高密度版本启动文件,以_hd.s结尾的那个
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-25 15:51:24 | 显示全部楼层
STM129 发表于 2016-1-25 15:21
楼主的是外架SRAM的吧
改了还是不行,编译提示:
\ OBJ\的Speex语音编码STM32F103-STK.axf:错误:L6406E ...

用的STM32F103RET6,内部64KB的SRAM
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-25 16:25:50 | 显示全部楼层
我的是STM32F107RC和STM32F103C8,在网上下了几个SPEEX包,没有一个放的出声音来,郁闷了
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-25 16:32:03 | 显示全部楼层
试试改STACK和HEAP,慢慢减小直到编译得过,看最终能不能运行。103RE是可以的。
对了,请教一下,你用什么工具看程序执行到哪一行的
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-25 16:45:49 | 显示全部楼层
MDK-ARM4.70
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-25 16:47:30 | 显示全部楼层

用的是JTAG或者SWD调试不
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-25 17:20:30 | 显示全部楼层
用SWD调试
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-25 17:44:43 | 显示全部楼层
这个是我试验的包。听说IAR编译正常运行,MDK编译后运行不了。

STM32F10x_AN2812_FW_V2.0.0.rar

644.4 KB, 下载次数: 851

3.5的库

回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-26 08:13:45 | 显示全部楼层
STM129 发表于 2016-1-25 17:44
这个是我试验的包。听说IAR编译正常运行,MDK编译后运行不了。

IAR没用过。如果运行不了,看能不能找到原因和方法
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-26 16:18:02 | 显示全部楼层
终于在STM32F103C8上放出声音来了多谢楼主讲到堆和栈,当把堆改为4KB时(0x00002000)不再出现硬件异常了。但还是没有声音输出,后来把PC_13这个按键去掉才放出声音,原来这个例程的板了有1个五向键和二个控制键。
  在51的时候堆和栈是连着的,就是堆栈。STM32把堆和栈分开了,栈在顶端,堆在厎,原来变量都是往堆里堆的,默认值只有512大小,难怪会出硬件异常
STM32F103-STK板.png
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-1-28 15:42:16 | 显示全部楼层
尝试而不气馁,试出来了,也是收获啊
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-2-27
在线时间
0 小时
发表于 2016-2-27 23:15:51 | 显示全部楼层
有在往回声消除的兄弟吗?
回复 支持 反对

使用道具 举报

17

主题

45

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
479
金钱
479
注册时间
2016-1-20
在线时间
48 小时
 楼主| 发表于 2016-2-29 09:05:15 | 显示全部楼层
Rhino007 发表于 2016-2-27 23:15
有在往回声消除的兄弟吗?

我没有,不知道有没有其它人弄过回声消除
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 04:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表