3750|0

9805

帖子

24

TA的资源

版主

楼主
 

利用MEMS麦克风测试比较耳机的性能(三)完善扫频测试 [复制链接]

 开始在用MEMS麦克风测试耳机时使用了扫频方式
方法是通过SensorTile的音频DAC生成指定频率的正弦信号
通过MEMS麦克风对单一频率采样,计算出当前幅度
提高信号频率,再采集、再计算
这次在原有基础上做了优化,包括:
1、解决生成正弦数据不平滑问题
2、解决频率切换有杂音问题
3、将幅值转换成分贝

正弦波生成函数
  1. //获得sampleCount在maxN倍以内,sampleCount小数最小时的最小N
  2. //N < sampleCount
  3. //maxSampleCount * N =/≈ integer
  4. //sampleCount要计算的样本数
  5. //maxSampleCount最大样本数
  6. //return N
  7. uint16_t get_repeat_cycle(float sampleCount,uint16_t maxN)
  8. {
  9.   uint16_t i;
  10.   uint16_t min = maxN;
  11.   float min_f = 1;
  12.   float f;
  13.   for(i=2;i<maxN;i++)
  14.   {
  15.     //得到a的小数部分
  16.     f = sampleCount*i - (int)(sampleCount*i);
  17.     //如果小数是0直接返回当前倍数
  18.     if(f == 0)
  19.     {
  20.       return i;
  21.     }
  22.     //否则,如果当前小数已经判断的最小的小数还小,用现在的替换
  23.     else if(f<min_f)
  24.     {
  25.       min_f = f;
  26.       //保存当前这个最小的小数对应的倍数
  27.       min = i;
  28.     }
  29.   }
  30.   return min;
  31. }
  32. //生成sin数据
  33. //返回sinTable长度
  34. uint16_t SineGenerator(int16_t sinTable[],float maxCode,float outFreq,float samplingFreq)
  35. {
  36.   //输出数据索引  
  37.   uint16_t i;
  38.   float tmp;
  39.   //采样率除输出频率得到总样本数量
  40.   float sampleCount = samplingFreq / outFreq;
  41.   //分步角度
  42.   float stepDegrees = 360.00 / (float)sampleCount ;
  43.   //分步弧度
  44.   stepDegrees = PI / 180.00 * stepDegrees;
  45.   //游标移到起始处
  46.   //在频率较高j时样本数较少,sampleCount不为整数时如果将小数舍去生成的波形会变形
  47.   //计算sampleCount在多少倍时为整数,或接近整数
  48.   uint16_t N = get_repeat_cycle(sampleCount,MAX_SIN_TABLE_SIZE/(uint16_t)sampleCount);
  49.   //sampleCount * N 得到最终的样本数
  50.   sampleCount *= N;
  51.   //取整数,实际无意义
  52.   sampleCount = (int)sampleCount;
  53.   //得到对应正弦数据
  54.   for(i=0;i<sampleCount;i++)
  55.   {
  56.     //得到当前弧度
  57.     tmp = stepDegrees * i;
  58.     //得到对应的sin数据
  59.     tmp = sin(tmp);
  60.     //+0.5四舍五入
  61.     sinTable[/size][/font][i][font=微软雅黑][size=4] = (int16_t)((tmp + 1)/2.00 * maxCode - (maxCode +1)/2 + 0.5);
  62.   }
  63.   return i;
  64. }
复制代码


声音测量和频率切换代码
  1.   while (1)
  2.   {   
  3. //      test();
  4. //      continue;
  5.     //数据达到FFT_SIZE时做FFT
  6.     if(fft_flag)
  7.     {
  8.       //填充左声道数据到fft_data
  9.       for(i=0;i<FFT_SIZE;i++)
  10.       {
  11.           fft_data[i*2] = audio_in[/size][/font][i][font=微软雅黑][size=4];
  12.           fft_data[i*2 + 1] = 0;
  13.       }
  14.       //FFT转换
  15.       fft();
  16.       maxFreq = get_maxIndex_freq();
  17.       //误差10%
  18.       if(abs((int)(maxFreq - freq)) < 40 || abs((int)(maxFreq - freq)) < freq * 0.2)
  19.       {
  20.         maxAmplitude = get_maxIndex_amplitude();
  21.         freqResp[freqRespIndex++] =  20 * log10(maxAmplitude/32768);
  22.         
  23.         //频率递增
  24.         freq += STEP_FREQ;
  25.         sinTableIndex[!sinTableArrayIndex] = 0;
  26.         //重新生成频率对应的SIN数据,添加到非当前数组
  27.         sinTableLength[!sinTableArrayIndex] = SineGenerator(sinTable[!sinTableArrayIndex],65535,freq,AUDIO_SAMPLING_FREQUENCY);
  28.         //切换频率
  29.         swicthingFreqFlag = 1;
  30.         if(freqRespIndex >= SCAN_COUNT)
  31.         {
  32.           BSP_AUDIO_OUT_Stop(PCM1774_X_0_handle,1);
  33.           while(1);
  34.           __NOP();
  35.         }
  36.       }
  37.       
  38.       HAL_Delay(50);  
  39.       fft_flag = 0;
  40.     }
  41.   }
  42. }
复制代码



main.c文件
main.c (13.4 KB, 下载次数: 2)


参考贴子

利用MEMS麦克风测试比较耳机的性能(二)粉噪测试
https://bbs.eeworld.com.cn/thread-586982-1-1.html

利用MEMS麦克风测试比较耳机的性能(一) 扫频测试
https://bbs.eeworld.com.cn/thread-573300-1-1.html

SensorTile正弦波发生器
https://bbs.eeworld.com.cn/thread-573240-1-1.html

点赞 关注(1)
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表