|
利用MEMS麦克风测试比较耳机的性能(三)完善扫频测试
[复制链接]
开始在用MEMS麦克风测试耳机时使用了扫频方式
方法是通过SensorTile的音频DAC生成指定频率的正弦信号
通过MEMS麦克风对单一频率采样,计算出当前幅度
提高信号频率,再采集、再计算
这次在原有基础上做了优化,包括:
1、解决生成正弦数据不平滑问题
2、解决频率切换有杂音问题
3、将幅值转换成分贝
正弦波生成函数
- //获得sampleCount在maxN倍以内,sampleCount小数最小时的最小N
- //N < sampleCount
- //maxSampleCount * N =/≈ integer
- //sampleCount要计算的样本数
- //maxSampleCount最大样本数
- //return N
- uint16_t get_repeat_cycle(float sampleCount,uint16_t maxN)
- {
- uint16_t i;
- uint16_t min = maxN;
- float min_f = 1;
- float f;
- for(i=2;i<maxN;i++)
- {
- //得到a的小数部分
- f = sampleCount*i - (int)(sampleCount*i);
- //如果小数是0直接返回当前倍数
- if(f == 0)
- {
- return i;
- }
- //否则,如果当前小数已经判断的最小的小数还小,用现在的替换
- else if(f<min_f)
- {
- min_f = f;
- //保存当前这个最小的小数对应的倍数
- min = i;
- }
- }
- return min;
- }
- //生成sin数据
- //返回sinTable长度
- uint16_t SineGenerator(int16_t sinTable[],float maxCode,float outFreq,float samplingFreq)
- {
- //输出数据索引
- uint16_t i;
- float tmp;
- //采样率除输出频率得到总样本数量
- float sampleCount = samplingFreq / outFreq;
- //分步角度
- float stepDegrees = 360.00 / (float)sampleCount ;
- //分步弧度
- stepDegrees = PI / 180.00 * stepDegrees;
- //游标移到起始处
- //在频率较高j时样本数较少,sampleCount不为整数时如果将小数舍去生成的波形会变形
- //计算sampleCount在多少倍时为整数,或接近整数
- uint16_t N = get_repeat_cycle(sampleCount,MAX_SIN_TABLE_SIZE/(uint16_t)sampleCount);
- //sampleCount * N 得到最终的样本数
- sampleCount *= N;
- //取整数,实际无意义
- sampleCount = (int)sampleCount;
- //得到对应正弦数据
- for(i=0;i<sampleCount;i++)
- {
- //得到当前弧度
- tmp = stepDegrees * i;
- //得到对应的sin数据
- tmp = sin(tmp);
- //+0.5四舍五入
- sinTable[/size][/font][i][font=微软雅黑][size=4] = (int16_t)((tmp + 1)/2.00 * maxCode - (maxCode +1)/2 + 0.5);
- }
- return i;
- }
复制代码
声音测量和频率切换代码
- while (1)
- {
- // test();
- // continue;
- //数据达到FFT_SIZE时做FFT
- if(fft_flag)
- {
- //填充左声道数据到fft_data
- for(i=0;i<FFT_SIZE;i++)
- {
- fft_data[i*2] = audio_in[/size][/font][i][font=微软雅黑][size=4];
- fft_data[i*2 + 1] = 0;
- }
- //FFT转换
- fft();
- maxFreq = get_maxIndex_freq();
- //误差10%
- if(abs((int)(maxFreq - freq)) < 40 || abs((int)(maxFreq - freq)) < freq * 0.2)
- {
- maxAmplitude = get_maxIndex_amplitude();
- freqResp[freqRespIndex++] = 20 * log10(maxAmplitude/32768);
-
- //频率递增
- freq += STEP_FREQ;
- sinTableIndex[!sinTableArrayIndex] = 0;
- //重新生成频率对应的SIN数据,添加到非当前数组
- sinTableLength[!sinTableArrayIndex] = SineGenerator(sinTable[!sinTableArrayIndex],65535,freq,AUDIO_SAMPLING_FREQUENCY);
- //切换频率
- swicthingFreqFlag = 1;
- if(freqRespIndex >= SCAN_COUNT)
- {
- BSP_AUDIO_OUT_Stop(PCM1774_X_0_handle,1);
- while(1);
- __NOP();
- }
- }
-
- HAL_Delay(50);
- fft_flag = 0;
- }
- }
- }
复制代码
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
|
|