9.18. 音频FFT频谱显示

概述

提供音频FFT频谱显示的使用流程

9.18.1. 使用流程

  • 1.打开解码服务后,在调用cmd AUDIO_DEC_OPEN 时候传递参数(解码服务打开流程详情查看 音频解码 章节)

/*中间省略其他参数*/
    req.dec.cmd     = AUDIO_DEC_OPEN;

    req.dec.effect  = AUDIO_EFFECT_SPECTRUM_FFT;

    err = server_request(__this->dec_server, AUDIO_REQ_DEC, &req);
    1. 获取音效处理句柄,调用cmd AUDIO_DEC_GET_EFFECT_HANDLE ,返回的 req.dec.get_hdl 就是音效处理句柄,可用一个全局变量暂时缓存起来供后续使用

req.dec.cmd     = AUDIO_DEC_GET_EFFECT_HANDLE;
req.dec.effect  = AUDIO_EFFECT_SPECTRUM_FFT;

err = server_request(__this->dec_server, AUDIO_REQ_DEC, &req);
    1. 获取频谱个数

audio_spectrum_fft_get_num(req.dec.get_hdl);
    1. 获取频谱值

short *db_data = audio_spectrum_fft_get_val(req.dec.get_hdl);//获取存储频谱值的地址
if (db_data) {
    for (int i = 0; i < audio_spectrum_fft_get_num(req.dec.get_hdl); i++) {
    //输出db_num个 db值
    /* printf("db_data db[%d] %d\n", i, db_data[i]); */
    }
}

Note

  • 获取音效处理句柄后,如果是异步调用api获取频谱值,要避免在调用AUDIO_DEC_STOP停止解码释放句柄后还继续访问,否则会出现内存越界访问的情况,请用户自行做好互斥处理

  • 需要打开宏 CONFIG_SPECTRUM_FFT_EFFECT_ENABLE ,外部库依赖lib_spectrum_show.a和硬件FFT模块

9.18.2. API参考

Functions

void *audio_spectrum_fft_open(void *priv, void *parm)

打开频谱运算

Parameters
  • priv – 私有指针

  • parm – 始化参数,详见结构体spectrum_fft_open_parm

Returns

句柄

int audio_spectrum_fft_close(void *priv)

关闭频谱计算处理

Parameters

priv – 句柄

Returns

0:成功 -1:失败

int audio_spectrum_fft_run(void *priv, short *data, int len, int sample_rate)

频谱计算同步处理,每次run都会把输入buf消耗完,才会往下走

Note

频谱计算处理,只获取输入的数据,不改变输入的数据

Parameters
  • priv – 句柄

  • data – 输入数据

  • len – 输入数据长度

  • sample_rate – 采样率

Returns

len

void audio_spectrum_fft_switch(void *priv, unsigned char en)

频谱计算运行过程做开关处理

Parameters
  • priv – 句柄

  • en – 0 关闭频响运算 1 打开频响运算

int audio_spectrum_fft_get_num(void *priv)

获取频谱个数

Parameters

priv – 句柄

Returns

返回频谱的个数

short *audio_spectrum_fft_get_val(void *priv)

获取频谱值

Parameters

priv – 句柄

Returns

返回存储频谱值的地址

struct spectrum_fft_open_parm
#include <spectrum_fft.h>

频谱运算参数结构体

Public Members

unsigned int sr

采样率

unsigned char channel

通道数

unsigned char mode

模式,双声道起作用,0计算的是第一声道的频谱值,1计算的是第二声道频谱值,2为第一声道与第二声道相加除2的频谱值

unsigned short run_points

运行一次采样点数

float attackFactor

下降因子[0,1)

float releaseFactor

上升因子[0,1)