|
我想通过mbed实时识别音高然后进入到不同的case中,网上没有搜到现成的识别音高方法目前我个人想到的方法如下:
1.连接麦克风到一个Analog in Pin
2.因为pin上没有负值的读数,所以sin状的声音波动图像的所有负值部分都以0显示
3.那么就可以数如图所示的红点来确定周期数,进而确定频率
4.部分code如下:
AnalogIn Ain(p15);
while(1){
float f; //f代表频率
int p=0; //用于数周期,p/2 即为总周期数
float a[1000];
float t; //把AnalogIn刷新1000次的总时间作为单位时间t
for(int i=0;i<1000;i++){
a[i]=Ain;
if(a[i]=0 & a[i-1]>0){ //数出一个如P1所在的点
static p++;
}
if(a[i]>0 & a[i-1]==0){ //数出一个如P2所在的点
static p++;
}
f= (p/2)/t; //用周期数除以时间得出频率,对应可知音高
}
wait(0.1) //每0.1秒对外界进行一次音高测试
}
现在的问题是
1.外界杂音不可能完全消除,如图出现杂音会影响测量准确度。mbed的敏感度是否足以过滤掉微小的杂音?有什么方法可以消除这些误差?
2.Analog in pin 上每一次的刷新时间是多少秒?
3.实际计算起来数据会很繁琐,所以想请问大家有没有更好的方法?
|
|