创龙科技
登录
直播中
王成
7年用户
189经验值
私信
关注
mic_in例程中数据接收指针三个buffer分别存储的是什么?
开启该帖子的消息推送
C6748
FFT
您好,创龙C6748的
开发板
带的mic_in例程中,请问一下接收buffer指针数组中的三个buffer分别存储的是什么内容呢?是按照时序存储采样到的数据,还是每个buffer存储不同类型的采样数据?
如果想要对这个数组的音频信号做FFT,想要用例程中的FFT进行,采样频率和mic_in一样设置为48000,采样点数设置为16384是否可以?我们将RxBufPtr直接作为输入传进FFT函数,程序运行后没有声音输出,不知是什么原因,还请帮忙看下,谢谢!
/****************************************************************************/
/* */
/* 快速傅里叶变换 / 快速傅里叶逆变换测试 */
/* */
/* 2014年04月20日 */
/* */
/****************************************************************************/
#include
// C 语言标准输入输出函数库
#include
// C 数学函数库
#include "mathlib.h" // DSP 数学函数库
#include "dsplib.h" // DSP 函数库
#include "FFT.h"
/****************************************************************************/
/* */
/* 宏定义 */
/* */
/****************************************************************************/
// 软件断点
//#define SW_BREAKPOINT asm(" SWBP 0 ");
// 快速傅里叶变换
// π 及 浮点数极小值
#define PI 3.14159
#define F_TOL (1e-06)
/****************************************************************************/
/* */
/* 全局变量 */
/* */
/****************************************************************************/
// 快速傅里叶变换测试
// 测试快速傅里叶变换点数
// 注意:
ti
DSP库 最大支持一次性计算 128K 个点的 FFT
#define Tn 16384
// 采样频率
#define Fs 48000.0
// 信号
float Input[2*Tn+4];
// FFT 输入信号
#pragma DATA_ALIGN(CFFT_In, 8);
float CFFT_In[2*Tn+4];
// FFT 输入信号 副本
float CFFT_InOrig[2*Tn+4];
// FFT 输出
#pragma DATA_ALIGN(CFFT_Out, 8);
float CFFT_Out[2*Tn+4];
// IFFT 输出
#pragma DATA_ALIGN(CFFT_InvOut, 8);
float CFFT_InvOut[2*Tn+4];
// 中间运算临时变量
float CTemp[2*Tn+4];
// 存储旋转因子
float Cw[2*Tn];
// 模
float Cmo[Tn+2];
// 二进制位翻转
#pragma DATA_ALIGN (brev, 8);
unsigned char brev[64]=
{
0x0, 0x20, 0x10, 0x30, 0x8, 0x28, 0x18, 0x38,
0x4, 0x24, 0x14, 0x34, 0xc, 0x2c, 0x1c, 0x3c,
0x2, 0x22, 0x12, 0x32, 0xa, 0x2a, 0x1a, 0x3a,
0x6, 0x26, 0x16, 0x36, 0xe, 0x2e, 0x1e, 0x3e,
0x1, 0x21, 0x11, 0x31, 0x9, 0x29, 0x19, 0x39,
0x5, 0x25, 0x15, 0x35, 0xd, 0x2d, 0x1d, 0x3d,
0x3, 0x23, 0x13, 0x33, 0xb, 0x2b, 0x1b, 0x3b,
0x7, 0x27, 0x17, 0x37, 0xf, 0x2f, 0x1f, 0x3f
};
/****************************************************************************/
/* */
/* 函数声明 */
/* */
/****************************************************************************/
/****************************************************************************/
/* */
/* 主函数 */
/* */
/****************************************************************************/
//int main(void)
//{
// FFT 测试
//FFTTest();
// 断点
//SW_BREAKPOINT;
//}
/****************************************************************************/
/* */
/* 快速傅里叶变换测试 */
/* */
/****************************************************************************/
// 产生旋转因子
void tw_gen(float *w, int n)
{
int i,j,k;
double x_t,y_t,theta1,theta2,theta3;
for(j=1,k=0;j<=n>>2;j=j<<2)
{
for(i=0;i
>2;i += j)
{
theta1=2*PI*i/n;
x_t=cos(theta1);
y_t=sin(theta1);
w[k]=(float)x_t;
w[k+1]=(float)y_t;
theta2=4*PI*i/n;
x_t=cos(theta2);
y_t=sin(theta2);
w[k+2]=(float)x_t;
w[k+3]=(float)y_t;
theta3=6*PI*i/n;
x_t=cos(theta3);
y_t=sin(theta3);
w[k+4]=(float)x_t;
w[k+5]=(float)y_t;
k+=6;
}
}
}
// 快速傅里叶变换
void FFT( unsigned int const *audioIn, unsigned int *audioOut)
{
// 产生待测试信号
unsigned int i;
// 确定快速傅里叶变换基
unsigned char rad;
if(Tn==16 || Tn==64 || Tn==256 || Tn==1024 || Tn==4096 || Tn==16384 || Tn==65536)
rad=4;
else if(Tn==8 || Tn==32 || Tn==128 || Tn==512 || Tn==2048 || Tn==8192 || Tn==32768)
rad=2;
else
{
printf ("不支持 计算 %d 点快速傅里叶变换!undefined",Tn);
return;
}
// 复数 FFT
for (i=0;i<2*Tn;i++)
CFFT_In=0.0;
for (i=0;i
{
CFFT_In[2*i]=(float)audioIn[2*i]; // 实部
CFFT_In[2*i+1]=0; // 虚部为 0
}
// 保留一份输入信号副本
memcpy(CFFT_InOrig,CFFT_In,2*Tn*sizeof(float));
// 产生旋转因子
tw_gen(Cw,Tn);
// FFT 计算
DSPF_sp_fftSPxSP(Tn,CFFT_In,Cw,CFFT_Out,brev,rad,0,Tn);
// 计算振幅
for(i=0;i
Cmo=0.0;
for(i=0;i
{
Cmo=sqrtsp(CFFT_Out[2*i]*CFFT_Out[2*i]+CFFT_Out[2*i+1]*CFFT_Out[2*i+1]);
Cmo=Cmo*2/Tn;
}
// 保留一份 FFT 结果副本
memcpy(CTemp,CFFT_Out,2*Tn*sizeof(float));
// IFFT 计算
DSPF_sp_ifftSPxSP(Tn,CFFT_Out,Cw,CFFT_InvOut,brev,rad,0,Tn);
// 恢复 FFT 结果
memcpy(CFFT_Out,CTemp,2*Tn*sizeof(float));
printf("undefined复数 FFT 测试结果:");
unsigned char Flag;
for(i=0;i
if(abs(CFFT_InOrig-CFFT_InvOut)>F_TOL)
Flag=1;
if(Flag==1)
printf ("失败!undefined");
else
printf ("成功!undefined");
for (i=0;i
{
audioOut=(unsigned int)CFFT_InvOut[2*i];
}
}
回帖
(3)
张晶
2019-10-21 10:15:31
lastFullRxBuf 将会在接收完成中断里更新。如果 lastFullRxBuf 与 lastSentTxBuf 不相等就会发送新的数据。
你的数据是经过处理后再输出,可能导致了数据不一样。
lastFullRxBuf 将会在接收完成中断里更新。如果 lastFullRxBuf 与 lastSentTxBuf 不相等就会发送新的数据。
你的数据是经过处理后再输出,可能导致了数据不一样。
举报
陈浩
2019-10-21 10:28:45
引用:
cmlzwkd 发表于 2019-10-21 11:52
谢谢回复。假如不做任何处理,只针对mic_in例程来说,接收数据的指针数组rxBufPtr接收到的值有没有经过编解码处理啊,还有在ccs中,在debug模式下,rxBufPtr的图一直是一条直线,不知道是怎么回事?
引用:
cmlzwkd 发表于 2019-10-21 11:52
谢谢回复。假如不做任何处理,只针对mic_in例程来说,接收数据的指针数组rxBufPtr接收到的值有没有经过编解码处理啊,还有在ccs中,在debug模式下,rxBufPtr的图一直是一条直线,不知道是怎么回事?
举报
石建军
2019-10-21 10:39:55
引用:
cmlzwkd 发表于 2019-10-21 11:52
拜托解答一下三楼问题啊!
引用:
cmlzwkd 发表于 2019-10-21 11:52
拜托解答一下三楼问题啊!
举报
更多回帖
rotate(-90deg);
回复
相关问答
C6748
FFT
mic_in
中
指针
数组问题如何解决
2020-05-13
1461
请问ADSP-21364 Singly Chained
Buffer
单缓冲链式DMA怎么运作的?
2018-09-29
1211
如何实现Labview对
三
轴加速度传感器
三个
轴向数值的波形显...
2013-05-04
7034
请问是我手里的
例程
有问题吗?
2019-06-26
1359
ADA4530-1的仿真 请问
buffer
/ADA4530/Amplifier
三个
子电路
分别
的作用是什么?
2018-08-07
4004
请问10s音频
存储
在ddr
存储
器,需要怎么编程?
2019-06-17
22486
用PSpice加载了ADA4530-1的.cir文件后里面有
buffer
/ADA4530/Amplifier
三个
子电路,这些电路是什么作用?
2023-11-17
234
请问ABC
三个
函数
中
的变量都是
存储
在任务的堆栈上面的吗?
2019-07-31
1540
Ring
Buffer
有什么特别?
2018-05-25
6618
FPGA的rom读取
数据
出错
2019-05-13
4417
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分