mic_in例程中数据接收指针的问题 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3861|回复: 3
打印 上一主题 下一主题

[未解决] mic_in例程中数据接收指针的问题

[复制链接]

4

主题

8

帖子

84

积分

注册会员

Rank: 2

积分
84
跳转到指定楼层
楼主
发表于 2017-6-16 21:57:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 方穹 于 2017-6-16 22:24 编辑

您好,创龙C6748的开发板带的mic_in例程中,请问一下接收buffer指针数组中的三个buffer分别存储的是什么内容呢?是按照时序存储采样到的数据,还是每个buffer存储不同类型的采样数据?
如果想要对这个数组的音频信号做FFT,想要用例程中的FFT进行,采样频率和mic_in一样设置为48000,采样点数设置为16384是否可以?我们将RxBufPtr直接作为输入传进FFT函数,程序运行后没有声音输出,不知是什么原因,还请帮忙看下,谢谢!







  1. /****************************************************************************/
  2. /*                                                                          */
  3. /*              快速傅里叶变换 / 快速傅里叶逆变换测试                       */
  4. /*                                                                          */
  5. /*              2014年04月20日                                              */
  6. /*                                                                          */
  7. /****************************************************************************/
  8. #include <stdio.h>                  // C 语言标准输入输出函数库
  9. #include <math.h>                   // C 数学函数库

  10. #include "mathlib.h"                // DSP 数学函数库
  11. #include "dsplib.h"                 // DSP 函数库
  12. #include "FFT.h"
  13. /****************************************************************************/
  14. /*                                                                          */
  15. /*              宏定义                                                      */
  16. /*                                                                          */
  17. /****************************************************************************/
  18. // 软件断点
  19. //#define SW_BREAKPOINT     asm(" SWBP 0 ");

  20. // 快速傅里叶变换
  21. // π 及 浮点数极小值
  22. #define PI                3.14159
  23. #define F_TOL             (1e-06)

  24. /****************************************************************************/
  25. /*                                                                          */
  26. /*              全局变量                                                    */
  27. /*                                                                          */
  28. /****************************************************************************/
  29. // 快速傅里叶变换测试
  30. // 测试快速傅里叶变换点数
  31. // 注意:TI DSP库 最大支持一次性计算 128K 个点的 FFT
  32. #define Tn  16384
  33. // 采样频率
  34. #define Fs  48000.0
  35. // 信号
  36. float Input[2*Tn+4];
  37. // FFT 输入信号
  38. #pragma DATA_ALIGN(CFFT_In, 8);
  39. float CFFT_In[2*Tn+4];
  40. // FFT 输入信号 副本
  41. float CFFT_InOrig[2*Tn+4];
  42. // FFT 输出
  43. #pragma DATA_ALIGN(CFFT_Out, 8);
  44. float CFFT_Out[2*Tn+4];
  45. // IFFT 输出
  46. #pragma DATA_ALIGN(CFFT_InvOut, 8);
  47. float CFFT_InvOut[2*Tn+4];
  48. // 中间运算临时变量
  49. float CTemp[2*Tn+4];
  50. // 存储旋转因子
  51. float Cw[2*Tn];
  52. // 模
  53. float Cmo[Tn+2];

  54. // 二进制位翻转
  55. #pragma DATA_ALIGN (brev, 8);
  56. unsigned char brev[64]=
  57. {
  58.         0x0, 0x20, 0x10, 0x30, 0x8, 0x28, 0x18, 0x38,
  59.         0x4, 0x24, 0x14, 0x34, 0xc, 0x2c, 0x1c, 0x3c,
  60.         0x2, 0x22, 0x12, 0x32, 0xa, 0x2a, 0x1a, 0x3a,
  61.         0x6, 0x26, 0x16, 0x36, 0xe, 0x2e, 0x1e, 0x3e,
  62.         0x1, 0x21, 0x11, 0x31, 0x9, 0x29, 0x19, 0x39,
  63.         0x5, 0x25, 0x15, 0x35, 0xd, 0x2d, 0x1d, 0x3d,
  64.         0x3, 0x23, 0x13, 0x33, 0xb, 0x2b, 0x1b, 0x3b,
  65.         0x7, 0x27, 0x17, 0x37, 0xf, 0x2f, 0x1f, 0x3f
  66. };

  67. /****************************************************************************/
  68. /*                                                                          */
  69. /*              函数声明                                                    */
  70. /*                                                                          */
  71. /****************************************************************************/


  72. /****************************************************************************/
  73. /*                                                                          */
  74. /*              主函数                                                      */
  75. /*                                                                          */
  76. /****************************************************************************/
  77. //int main(void)
  78. //{
  79.         // FFT 测试
  80.         //FFTTest();

  81.         // 断点
  82.         //SW_BREAKPOINT;
  83. //}

  84. /****************************************************************************/
  85. /*                                                                          */
  86. /*              快速傅里叶变换测试                                          */
  87. /*                                                                          */
  88. /****************************************************************************/
  89. // 产生旋转因子
  90. void tw_gen(float *w, int n)
  91. {
  92.         int i,j,k;
  93.         double x_t,y_t,theta1,theta2,theta3;

  94.         for(j=1,k=0;j<=n>>2;j=j<<2)
  95.         {
  96.                 for(i=0;i<n>>2;i += j)
  97.                 {
  98.                         theta1=2*PI*i/n;
  99.                         x_t=cos(theta1);
  100.                         y_t=sin(theta1);
  101.                         w[k]=(float)x_t;
  102.                         w[k+1]=(float)y_t;

  103.                         theta2=4*PI*i/n;
  104.                         x_t=cos(theta2);
  105.                         y_t=sin(theta2);
  106.                         w[k+2]=(float)x_t;
  107.                         w[k+3]=(float)y_t;

  108.                         theta3=6*PI*i/n;
  109.                         x_t=cos(theta3);
  110.                         y_t=sin(theta3);
  111.                         w[k+4]=(float)x_t;
  112.                         w[k+5]=(float)y_t;
  113.                         k+=6;
  114.                 }
  115.         }
  116. }

  117. // 快速傅里叶变换
  118. void FFT( unsigned int const *audioIn, unsigned int *audioOut)
  119. {

  120.         // 产生待测试信号
  121.         unsigned int i;
  122.         // 确定快速傅里叶变换基
  123.         unsigned char rad;
  124.         if(Tn==16 || Tn==64 || Tn==256 || Tn==1024 || Tn==4096 || Tn==16384 || Tn==65536)
  125.                 rad=4;
  126.         else if(Tn==8 || Tn==32 || Tn==128 || Tn==512 || Tn==2048 || Tn==8192 || Tn==32768)
  127.                 rad=2;
  128.         else
  129.         {
  130.                 printf ("不支持 计算 %d 点快速傅里叶变换!\n",Tn);
  131.                 return;
  132.         }


  133.         // 复数 FFT
  134.         for (i=0;i<2*Tn;i++)
  135.                 CFFT_In=0.0;
  136.         for (i=0;i<Tn;i++)
  137.         {
  138.                 CFFT_In[2*i]=(float)audioIn[2*i];                // 实部
  139.                 CFFT_In[2*i+1]=0;                             // 虚部为 0
  140.         }

  141.         // 保留一份输入信号副本
  142.         memcpy(CFFT_InOrig,CFFT_In,2*Tn*sizeof(float));

  143.         // 产生旋转因子
  144.         tw_gen(Cw,Tn);

  145.         // FFT 计算
  146.         DSPF_sp_fftSPxSP(Tn,CFFT_In,Cw,CFFT_Out,brev,rad,0,Tn);



  147.         // 计算振幅
  148.         for(i=0;i<Tn;i++)
  149.                 Cmo=0.0;
  150.         for(i=0;i<Tn+2;i++)
  151.         {
  152.                 Cmo=sqrtsp(CFFT_Out[2*i]*CFFT_Out[2*i]+CFFT_Out[2*i+1]*CFFT_Out[2*i+1]);
  153.                 Cmo=Cmo*2/Tn;
  154.         }

  155.         // 保留一份 FFT 结果副本
  156.         memcpy(CTemp,CFFT_Out,2*Tn*sizeof(float));

  157.         // IFFT 计算
  158.         DSPF_sp_ifftSPxSP(Tn,CFFT_Out,Cw,CFFT_InvOut,brev,rad,0,Tn);



  159.         // 恢复 FFT 结果
  160.         memcpy(CFFT_Out,CTemp,2*Tn*sizeof(float));

  161.         printf("\n复数 FFT 测试结果:");

  162.         unsigned char Flag;
  163.         for(i=0;i<Tn;i++)
  164.                 if(abs(CFFT_InOrig-CFFT_InvOut)>F_TOL)
  165.                         Flag=1;

  166.         if(Flag==1)
  167.                         printf ("失败!\n");
  168.         else
  169.                         printf ("成功!\n");

  170.    for (i=0;i<Tn;i++)
  171.                                         {
  172.                                                 audioOut=(unsigned int)CFFT_InvOut[2*i];
  173.                                         }

  174. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-6-17 13:51:34 | 只看该作者
lastFullRxBuf 将会在接收完成中断里更新。如果 lastFullRxBuf 与 lastSentTxBuf 不相等就会发送新的数据。

你的数据是经过处理后再输出,可能导致了数据不一样。
回复 支持 反对

使用道具 举报

4

主题

8

帖子

84

积分

注册会员

Rank: 2

积分
84
板凳
 楼主| 发表于 2017-6-17 15:10:22 | 只看该作者
本帖最后由 方穹 于 2017-6-24 13:13 编辑
human 发表于 2017-6-17 13:51
lastFullRxBuf 将会在接收完成中断里更新。如果 lastFullRxBuf 与 lastSentTxBuf 不相等就会发送新的数据。 ...

谢谢回复。假如不做任何处理,只针对mic_in例程来说,接收数据的指针数组rxBufPtr接收到的值有没有经过编解码处理啊,还有在ccs中,在debug模式下,rxBufPtr的图一直是一条直线,不知道是怎么回事?
回复 支持 反对

使用道具 举报

4

主题

8

帖子

84

积分

注册会员

Rank: 2

积分
84
地板
 楼主| 发表于 2017-6-23 10:42:46 | 只看该作者
human 发表于 2017-6-17 13:51
lastFullRxBuf 将会在接收完成中断里更新。如果 lastFullRxBuf 与 lastSentTxBuf 不相等就会发送新的数据。 ...

拜托解答一下三楼问题啊!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-6 18:54 , Processed in 0.057455 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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