2015-01-03 31 views
0

開發映射樂器上演奏的音符的應用程序。例如: - 如果在鋼琴上播放C,應用程序將顯示一個C.Android:將從FFT獲得的映射頻率映射到音符

double [] notes={16.35,17.32,18.35,19.45,20.6,21.83,23.12,24.5,25.96,27.5,29.14,30.87}; 
     char [] notations={'c','C','d','D','e','f','F','g','G','a','A','b'}; 
     int index=0; 
     double minvalue=999999; 
     if(values[0]>16.34){ 
     for (int i=0;i<=11;i++) 
     { 
      double result=values[0]%notes[i]; 
      if(result==0) 
      { 
       index=i; 
       break; 
      } 
      double temp=notes[i]-result; 
      if(temp<minvalue) 
      { 
       minvalue=temp; 
       index=i; 
      } 
     } 
     TextView display2 = (TextView) findViewById(R.id.textView2); 
     display2.setText(String.valueOf(notations[index])); 

筆記數組由12個不同音符的頻率組成。 value [0]由​​獲得的頻率組成。 value [0]%notes [i]用於確定頻率所屬的最接近的音符。

問題:

值發生很大的變化! 因此,當在鋼琴上演奏C時,它在C上設置,但是由於改變的值而快速變化到另一個。

是否有更好的映射方案可以遵循?

回答

2

你應該尋找pitch detection algorithm

真實世界的聲音,不是一成不變的。每個泛音的相對強度可能隨時間以不同的速率變化。給定時刻的聲音基頻可能與FFT峯值幅度不同。

P.S.找到more comprehensive answer

+0

謝謝您的回覆!我嘗試過使用過零方法。我應該多長時間使用過零點方法來調用計算頻率的功能?因爲我不希望它經常改變 – shivram