OpenEdv-开源电子网

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

stm32 发声 codec2

[复制链接]

4

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-7-2
在线时间
17 小时
发表于 2015-6-5 18:26:56 | 显示全部楼层 |阅读模式
研究stm32 发声 掉沟里了,现在wav发声,3K字节一个音(比如“1”,0.3秒),这样片上flash剩下的空间报个时应该可以了
我看到一个更好的语音压缩编码开源 项目  可以做到1秒不到1k,还有stm32的例程,手上没有f4的板子,技术也渣,原子老兄或论坛里的大神给移植到开发板上,要上能移植到mini或战舰的f103板上就更好了,省的可不只一个语音芯片啊,能做多少应用啊
https://svn.code.sf.net/p/freetel/code/codec2/stm32/
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-6-5 22:44:31 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-26 11:54:25 | 显示全部楼层
Codec2果然是个好东西
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-26 14:49:46 | 显示全部楼层
老外把它放在STM32F405/407上跑了
Assembly_100nF.jpg
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-27 17:29:47 | 显示全部楼层
/*---------------------------------------------------------------------------*\

  FILE........: codec2.c
  AUTHOR......: David Rowe
  DATE CREATED: 21/8/2010

  Codec2 充分量化编码器和解码器的功能。如果你想使用
  codec2, 在codec2_xxx功能是给你的。

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

/*
  Copyright (C) 2010 David Rowe

  All rights reserved.

  这个程序是自由软件;你可以重新分配和/或修改
  其下的GNU宽通用公共许可证2.1版本的条款,如
  由自由软件基金会发布。这个程序是
  分布在希望这将是有用的,但没有任何
   保证;没有适销性的内在保证或
  适用于某一特定用途。见GNU通用公共
  许可证的更多细节。

  你应该已经收到一份GNU宽通用公共许可证的副本
  随着这一计划;如果不是,请参阅<http://www.gnu.org/licenses/>。
*/

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "defines.h"
#include "sine.h"
#include "nlp.h"
#include "dump.h"
#include "lpc.h"
#include "quantise.h"
#include "phase.h"
#include "interp.h"
#include "postfilter.h"
#include "codec2.h"
#include "lsp.h"
#include "codec2_internal.h"
#include "machdep.h"
#include "bpf.h"
#include "bpfb.h"

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

                             函数头

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

void analyse_one_frame(struct CODEC2 *c2, MODEL *model, short speech[]);
void synthesise_one_frame(struct CODEC2 *c2, short speech[], MODEL *model,
                          COMP Aw[]);
void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_3200(struct CODEC2 *c2, short speech[], const unsigned char * bits);
void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_2400(struct CODEC2 *c2, short speech[], const unsigned char * bits);
void codec2_encode_1600(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_1600(struct CODEC2 *c2, short speech[], const unsigned char * bits);
void codec2_encode_1400(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_1400(struct CODEC2 *c2, short speech[], const unsigned char * bits);
void codec2_encode_1300(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_1300(struct CODEC2 *c2, short speech[], const unsigned char * bits, float ber_est);
void codec2_encode_1200(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_1200(struct CODEC2 *c2, short speech[], const unsigned char * bits);
void codec2_encode_700(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_700(struct CODEC2 *c2, short speech[], const unsigned char * bits);
void codec2_encode_700b(struct CODEC2 *c2, unsigned char * bits, short speech[]);
void codec2_decode_700b(struct CODEC2 *c2, short speech[], const unsigned char * bits);
static void ear_protection(float in_out[], int n);

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

                                功能

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

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

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

  创建和初始化编解码器的一个实例。返回一个指针
  对失败的编解码器状态或NULL。一组状态是
  足够了整整duuplex编解码器(即编码器和解码器)。
  您无需为编解码器需要独立的国家。 看到
  c2enc.c和c2dec.c的例子。

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

struct CODEC2 * codec2_create(int mode)
{
    struct CODEC2 *c2;
    int            i,l;

    if ((mode != CODEC2_MODE_3200) &&
           (mode != CODEC2_MODE_2400) &&
           (mode != CODEC2_MODE_1600) &&
           (mode != CODEC2_MODE_1400) &&
           (mode != CODEC2_MODE_1300) &&
           (mode != CODEC2_MODE_1200) &&
           (mode != CODEC2_MODE_700) &&
           (mode != CODEC2_MODE_700B)
        ) {
        return NULL;
    }

    c2 = (struct CODEC2*)malloc(sizeof(struct CODEC2));
    if (c2 == NULL)
        return NULL;

    c2->mode = mode;
    for(i=0; i<M; i++)
        c2->Sn = 1.0;
    c2->hpf_states[0] = c2->hpf_states[1] = 0.0;
    for(i=0; i<2*N; i++)
        c2->Sn_ = 0;
    c2->fft_fwd_cfg = kiss_fft_alloc(FFT_ENC, 0, NULL, NULL);
    make_analysis_window(c2->fft_fwd_cfg, c2->w,c2->W);
    make_synthesis_window(c2->Pn);
    c2->fft_inv_cfg = kiss_fft_alloc(FFT_DEC, 1, NULL, NULL);
    quantise_init();
    c2->prev_Wo_enc = 0.0;
    c2->bg_est = 0.0;
    c2->ex_phase = 0.0;

    for(l=1; l<=MAX_AMP; l++)
        c2->prev_model_dec.A[l] = 0.0;
    c2->prev_model_dec.Wo = TWO_PI/P_MAX;
    c2->prev_model_dec.L = PI/c2->prev_model_dec.Wo;
    c2->prev_model_dec.voiced = 0;

    for(i=0; i<LPC_ORD; i++) {
      c2->prev_lsps_dec = i*PI/(LPC_ORD+1);
    }
    c2->prev_e_dec = 1;

    c2->nlp = nlp_create(M);
    if (c2->nlp == NULL) {
        free (c2);
        return NULL;
    }

    if (mode == CODEC2_MODE_700B)
        c2->gray = 0;             // 自然二进制更好地为格状解码(后希望加入)
    else
        c2->gray = 1;

    c2->lpc_pf = 1; c2->bass_boost = 1; c2->beta = LPCPF_BETA; c2->gamma = LPCPF_GAMMA;

    c2->xq_enc[0] = c2->xq_enc[1] = 0.0;
    c2->xq_dec[0] = c2->xq_dec[1] = 0.0;

    c2->smoothing = 0;

    c2->bpf_buf = (float*)malloc(sizeof(float)*(BPF_N+4*N));
    assert(c2->bpf_buf != NULL);
    for(i=0; i<BPF_N+4*N; i++)
        c2->bpf_buf = 0.0;

    c2->softdec = NULL;

    return c2;
}
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-27 17:30:41 | 显示全部楼层
/*---------------------------------------------------------------------------*\

  功能....: codec2_destroy
  AUTHOR......: David Rowe
  DATE CREATED: 21/8/2010

  摧毁的编解码器的一个实例。

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

void codec2_destroy(struct CODEC2 *c2)
{
    assert(c2 != NULL);
    free(c2->bpf_buf);
    nlp_destroy(c2->nlp);
    KISS_FFT_FREE(c2->fft_fwd_cfg);
    KISS_FFT_FREE(c2->fft_inv_cfg);
    free(c2);
}

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

  功能....: codec2_bits_per_frame
  AUTHOR......: David Rowe
  DATE CREATED: Nov 14 2011

返回每帧的比特数。

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

int codec2_bits_per_frame(struct CODEC2 *c2) {
    if (c2->mode == CODEC2_MODE_3200)
        return 64;
    if (c2->mode == CODEC2_MODE_2400)
        return 48;
    if  (c2->mode == CODEC2_MODE_1600)
        return 64;
    if  (c2->mode == CODEC2_MODE_1400)
        return 56;
    if  (c2->mode == CODEC2_MODE_1300)
        return 52;
    if  (c2->mode == CODEC2_MODE_1200)
        return 48;
    if  (c2->mode == CODEC2_MODE_700)
        return 28;
    if  (c2->mode == CODEC2_MODE_700B)
        return 28;

    return 0; /* 不应该在这里 */
}


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

  FUNCTION....: codec2_samples_per_frame
  AUTHOR......: David Rowe
  DATE CREATED: Nov 14 2011

  返回每帧语音样本的数目。

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

int codec2_samples_per_frame(struct CODEC2 *c2) {
    if (c2->mode == CODEC2_MODE_3200)
        return 160;
    if (c2->mode == CODEC2_MODE_2400)
        return 160;
    if  (c2->mode == CODEC2_MODE_1600)
        return 320;
    if  (c2->mode == CODEC2_MODE_1400)
        return 320;
    if  (c2->mode == CODEC2_MODE_1300)
        return 320;
    if  (c2->mode == CODEC2_MODE_1200)
        return 320;
    if  (c2->mode == CODEC2_MODE_700)
        return 320;
    if  (c2->mode == CODEC2_MODE_700B)
        return 320;

    return 0; /* 不应该在这里 */
}

void codec2_encode(struct CODEC2 *c2, unsigned char *bits, short speech[])
{
    assert(c2 != NULL);
    assert(
           (c2->mode == CODEC2_MODE_3200) ||
           (c2->mode == CODEC2_MODE_2400) ||
           (c2->mode == CODEC2_MODE_1600) ||
           (c2->mode == CODEC2_MODE_1400) ||
           (c2->mode == CODEC2_MODE_1300) ||
           (c2->mode == CODEC2_MODE_1200) ||
           (c2->mode == CODEC2_MODE_700)  ||
           (c2->mode == CODEC2_MODE_700B)
           );

    if (c2->mode == CODEC2_MODE_3200)
        codec2_encode_3200(c2, bits, speech);
    if (c2->mode == CODEC2_MODE_2400)
        codec2_encode_2400(c2, bits, speech);
    if (c2->mode == CODEC2_MODE_1600)
        codec2_encode_1600(c2, bits, speech);
    if (c2->mode == CODEC2_MODE_1400)
        codec2_encode_1400(c2, bits, speech);
    if (c2->mode == CODEC2_MODE_1300)
        codec2_encode_1300(c2, bits, speech);
    if (c2->mode == CODEC2_MODE_1200)
        codec2_encode_1200(c2, bits, speech);
#ifndef CORTEX_M4
    if (c2->mode == CODEC2_MODE_700)
        codec2_encode_700(c2, bits, speech);
    if (c2->mode == CODEC2_MODE_700B)
        codec2_encode_700b(c2, bits, speech);
#endif
}

void codec2_decode(struct CODEC2 *c2, short speech[], const unsigned char *bits)
{
    codec2_decode_ber(c2, speech, bits, 0.0);
}

void codec2_decode_ber(struct CODEC2 *c2, short speech[], const unsigned char *bits, float ber_est)
{
    assert(c2 != NULL);
    assert(
           (c2->mode == CODEC2_MODE_3200) ||
           (c2->mode == CODEC2_MODE_2400) ||
           (c2->mode == CODEC2_MODE_1600) ||
           (c2->mode == CODEC2_MODE_1400) ||
           (c2->mode == CODEC2_MODE_1300) ||
           (c2->mode == CODEC2_MODE_1200) ||
           (c2->mode == CODEC2_MODE_700) ||
           (c2->mode == CODEC2_MODE_700B)
           );

    if (c2->mode == CODEC2_MODE_3200)
        codec2_decode_3200(c2, speech, bits);
    if (c2->mode == CODEC2_MODE_2400)
        codec2_decode_2400(c2, speech, bits);
    if (c2->mode == CODEC2_MODE_1600)
        codec2_decode_1600(c2, speech, bits);
    if (c2->mode == CODEC2_MODE_1400)
        codec2_decode_1400(c2, speech, bits);
    if (c2->mode == CODEC2_MODE_1300)
        codec2_decode_1300(c2, speech, bits, ber_est);
    if (c2->mode == CODEC2_MODE_1200)
        codec2_decode_1200(c2, speech, bits);
#ifndef CORTEX_M4
    if (c2->mode == CODEC2_MODE_700)
        codec2_decode_700(c2, speech, bits);
    if (c2->mode == CODEC2_MODE_700B)
        codec2_decode_700b(c2, speech, bits);
#endif
}


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

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-27 17:31:20 | 显示全部楼层
FUNCTION....: codec2_encode_3200
  AUTHOR......: David Rowe
  DATE CREATED: 13 Sep 2012

  Encodes 160 speech samples (20ms of speech) into 64 bits.

  The codec2 algorithm actually operates internally on 10ms (80
  sample) frames, so we run the encoding algorithm twice.  On the
  first frame we just send the voicing bits.  On the second frame we
  send all model parameters.  Compared to 2400 we use a larger number
  of bits for the LSPs and non-VQ pitch and energy.

  The bit allocation is:

    Parameter                      bits/frame
    --------------------------------------
    Harmonic magnitudes (LSPs)     50
    Pitch (Wo)                      7
    Energy                          5
    Voicing (10ms update)           2
    TOTAL                          64

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

void codec2_encode_3200(struct CODEC2 *c2, unsigned char * bits, short speech[])
{
    MODEL   model;
    float   ak[LPC_ORD+1];
    float   lsps[LPC_ORD];
    float   e;
    int     Wo_index, e_index;
    int     lspd_indexes[LPC_ORD];
    int     i;
    unsigned int nbit = 0;

    assert(c2 != NULL);

    memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8));

    /* first 10ms analysis frame - we just want voicing */

    analyse_one_frame(c2, &model, speech);
    pack(bits, &nbit, model.voiced, 1);

    /* second 10ms analysis frame */

    analyse_one_frame(c2, &model, &speech[N]);
    pack(bits, &nbit, model.voiced, 1);
    Wo_index = encode_Wo(model.Wo, WO_BITS);
    pack(bits, &nbit, Wo_index, WO_BITS);

    e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD);
    e_index = encode_energy(e, E_BITS);
    pack(bits, &nbit, e_index, E_BITS);

    encode_lspds_scalar(lspd_indexes, lsps, LPC_ORD);
    for(i=0; i<LSPD_SCALAR_INDEXES; i++) {
        pack(bits, &nbit, lspd_indexes[i], lspd_bits(i));
    }
    assert(nbit == (unsigned)codec2_bits_per_frame(c2));
}


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

  FUNCTION....: codec2_decode_3200
  AUTHOR......: David Rowe
  DATE CREATED: 13 Sep 2012

  Decodes a frame of 64 bits into 160 samples (20ms) of speech.

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

void codec2_decode_3200(struct CODEC2 *c2, short speech[], const unsigned char * bits)
{
    MODEL   model[2];
    int     lspd_indexes[LPC_ORD];
    float   lsps[2][LPC_ORD];
    int     Wo_index, e_index;
    float   e[2];
    float   snr;
    float   ak[2][LPC_ORD+1];
    int     i,j;
    unsigned int nbit = 0;
    COMP    Aw[FFT_ENC];

    assert(c2 != NULL);

    /* only need to zero these out due to (unused) snr calculation */

    for(i=0; i<2; i++)
        for(j=1; j<=MAX_AMP; j++)
            model[i].A[j] = 0.0;

    /* unpack bits from channel ------------------------------------*/

    /* this will partially fill the model params for the 2 x 10ms
       frames */

    model[0].voiced = unpack(bits, &nbit, 1);
    model[1].voiced = unpack(bits, &nbit, 1);

    Wo_index = unpack(bits, &nbit, WO_BITS);
    model[1].Wo = decode_Wo(Wo_index, WO_BITS);
    model[1].L  = PI/model[1].Wo;

    e_index = unpack(bits, &nbit, E_BITS);
    e[1] = decode_energy(e_index, E_BITS);

    for(i=0; i<LSPD_SCALAR_INDEXES; i++) {
        lspd_indexes[i] = unpack(bits, &nbit, lspd_bits(i));
    }
    decode_lspds_scalar(&lsps[1][0], lspd_indexes, LPC_ORD);

    /* interpolate ------------------------------------------------*/

    /* Wo and energy are sampled every 20ms, so we interpolate just 1
       10ms frame between 20ms samples */

    interp_Wo(&model[0], &c2->prev_model_dec, &model[1]);
    e[0] = interp_energy(c2->prev_e_dec, e[1]);

    /* LSPs are sampled every 20ms so we interpolate the frame in
       between, then recover spectral amplitudes */

    interpolate_lsp_ver2(&lsps[0][0], c2->prev_lsps_dec, &lsps[1][0], 0.5, LPC_ORD);

    for(i=0; i<2; i++) {
        lsp_to_lpc(&lsps[i][0], &ak[i][0], LPC_ORD);
        aks_to_M2(c2->fft_fwd_cfg, &ak[i][0], LPC_ORD, &model[i], e[i], &snr, 0, 0,
                  c2->lpc_pf, c2->bass_boost, c2->beta, c2->gamma, Aw);
        apply_lpc_correction(&model[i]);
        synthesise_one_frame(c2, &speech[N*i], &model[i], Aw);
    }

    /* update memories for next frame ----------------------------*/

    c2->prev_model_dec = model[1];
    c2->prev_e_dec = e[1];
    for(i=0; i<LPC_ORD; i++)
        c2->prev_lsps_dec[i] = lsps[1][i];
}


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

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

  Encodes 160 speech samples (20ms of speech) into 48 bits.

  The codec2 algorithm actually operates internally on 10ms (80
  sample) frames, so we run the encoding algorithm twice.  On the
  first frame we just send the voicing bit.  On the second frame we
  send all model parameters.

  The bit allocation is:

    Parameter                      bits/frame
    --------------------------------------
    Harmonic magnitudes (LSPs)     36
    Joint VQ of Energy and Wo       8
    Voicing (10ms update)           2
    Spare                           2
    TOTAL                          48

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

void codec2_encode_2400(struct CODEC2 *c2, unsigned char * bits, short speech[])
{
    MODEL   model;
    float   ak[LPC_ORD+1];
    float   lsps[LPC_ORD];
    float   e;
    int     WoE_index;
    int     lsp_indexes[LPC_ORD];
    int     i;
    int     spare = 0;
    unsigned int nbit = 0;

    assert(c2 != NULL);

    memset(bits, '\0', ((codec2_bits_per_frame(c2) + 7) / 8));

    /* first 10ms analysis frame - we just want voicing */

    analyse_one_frame(c2, &model, speech);
    pack(bits, &nbit, model.voiced, 1);

    /* second 10ms analysis frame */

    analyse_one_frame(c2, &model, &speech[N]);
    pack(bits, &nbit, model.voiced, 1);

    e = speech_to_uq_lsps(lsps, ak, c2->Sn, c2->w, LPC_ORD);
    WoE_index = encode_WoE(&model, e, c2->xq_enc);
    pack(bits, &nbit, WoE_index, WO_E_BITS);

    encode_lsps_scalar(lsp_indexes, lsps, LPC_ORD);
    for(i=0; i<LSP_SCALAR_INDEXES; i++) {
        pack(bits, &nbit, lsp_indexes[i], lsp_bits(i));
    }
    pack(bits, &nbit, spare, 2);

    assert(nbit == (unsigned)codec2_bits_per_frame(c2));
}


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

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

  Decodes frames of 48 bits into 160 samples (20ms) of speech.

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

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2016-1-27 17:32:12 | 显示全部楼层
摸索摸索
回复 支持 反对

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2016-3-20
在线时间
12 小时
发表于 2016-11-16 20:58:07 | 显示全部楼层
你好,你的地址失效了,想问下你有没有老外项目的新的地址,我想研究下
回复 支持 反对

使用道具 举报

4

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
622
金钱
622
注册时间
2016-5-11
在线时间
40 小时
发表于 2017-4-27 16:03:34 | 显示全部楼层
楼主有没有移植成功呢...
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2017-7-2
在线时间
1 小时
发表于 2017-7-2 23:58:19 | 显示全部楼层
同问同问同问同问同问同问
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-21
在线时间
2 小时
发表于 2018-9-21 21:19:09 | 显示全部楼层
语音压缩模块
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-21
在线时间
2 小时
发表于 2018-9-21 21:20:49 | 显示全部楼层
语音压缩模块参考

语音压缩模块、北斗卫星通信语音模块.pdf

449.94 KB, 下载次数: 54

语音压缩模块

回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2019-10-22
在线时间
0 小时
发表于 2019-10-22 16:29:32 | 显示全部楼层
本帖最后由 tangdh18 于 2019-10-22 16:32 编辑

原子哥,你好!我现在做一个项目,想用开源的codec2,请问当初你有成功移植到STM32F407上?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
54
金钱
54
注册时间
2019-10-24
在线时间
11 小时
发表于 2019-10-27 04:26:52 | 显示全部楼层
我把codec2移植到STM32F409+CubeMX+freeRTOS+fatfs,从SD卡上读取raw语音,用450bps编码后再写到SD卡,在电脑上解码后听不清,用电脑编码的同一段声音再用电脑解码还能听清。我调试中发现最初与电脑运行过程有分歧的是make_analysis_window函数中的W数组的值,可能是DSP函数库的arm_cfft_f32与kiss_fft有差异,谁能帮我一下?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-12-20
在线时间
1 小时
发表于 2020-12-27 20:37:19 | 显示全部楼层
STM129 发表于 2016-1-26 14:49
老外把它放在STM32F405/407上跑了

你好,我看你以前移植codec 2到keil中用在STM32F40X中,请问移植成功了吗?
我移植时发现好多编译错误,感觉是C++代码在C环境里面编译,好多地方是有问题的。
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2020-12-20
在线时间
1 小时
发表于 2020-12-27 20:37:45 | 显示全部楼层
科技骏马 发表于 2019-10-27 04:26
我把codec2移植到STM32F409+CubeMX+freeRTOS+fatfs,从SD卡上读取raw语音,用450bps编码后再写到SD卡,在电 ...

你好,我看你以前移植codec 2到keil中用在STM32F40X中,请问移植成功了吗?
我移植时发现好多编译错误,感觉是C++代码在C环境里面编译,好多地方是有问题的。
回复 支持 反对

使用道具 举报

27

主题

143

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1243
金钱
1243
注册时间
2016-1-23
在线时间
487 小时
发表于 2021-1-6 22:14:45 | 显示全部楼层
wenxiangyun 发表于 2020-12-27 20:37
你好,我看你以前移植codec 2到keil中用在STM32F40X中,请问移植成功了吗?
我移植时发现好多编译错误, ...

目前还没看到有人移植成功
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 16:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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