2016-04-14 46 views
0

Androidで生成される正弦波を長年研究していて、サンプルコードをオンラインで手に入れました。しかし、自分でコードを書くときにはまだ混乱しています。 私は式によって生成された正弦波のバッファを再生するときIあまりノイズがMath.sin((2.0 *にMath.PI * I)/ sampleInterval)」があるJavaでAndroidで正弦波を生成するとノイズが多い

double[] buf = new double[(int) sampleRate]; 
byte[] buffer = new byte[(int) sampleRate]; 
double sampleInterval = sampleRate/frequency; 
for(int i=0; i<sampleRate;i++){ 
    buf[i] = (Math.sin((2.0*Math.PI*i)/sampleInterval)); 
    buffer[i] = (byte)(buf[i]*Byte.MAX_VALUE); 
} 
while(flag) { 
    audioTrack.write(buffer, 0, buffer.length); 
} 
  1. を以下のようなコードを使用"私はそれがJavaの問題であることを知らない& Androidまたは私のコーディング。シミュレーターと私の実際のSony Phoneの両方がノイズを示しました。しかし、私のクラスメートのラップトップでMatlabと同じ公式はうまくいくことができます。 私はまた、デスクトップJavaコードでDataSourceLineを使用しようとしました。ノイズも存在します。

2.音は不安定になることがありますが、時には連続的ですが、時には音の明白な規則的な浮き沈みで断続的になることがあります。

コードを安定して正確にするためにコードを改善するにはどうすればよいですか?

+0

の可能性のある重複した([バックグラウンドのノイズJavaで正弦波を生成] http://stackoverflow.com/questions/740619/noise-in-background-whenでそれを行うことができます-generating-sine-wave-in-java) –

答えて

0

なぜ2つのバッファーですか?

あなたは1

double phase = 0.0; 
amp = 10000; 
short[] buffer = new short[BUFSIZE]; // BUFSIZE should be result from audiotrack.getMinBufferSize 
double phaseIncrement = (2 * Math.PI * frequency)/sampleRate; 
for (int i = 0; i < BUFSIZE; i++) { 
    buffer[i] = (short) (amp * Math.sin(phase)); 
    phase += phaseIncrement; 
} 

audioTrack.write(buffer, 0, buffer.length); 
+0

私のコードを更新しようとしました。それは動作し、ノイズは減少します。しかし時々彼らはまだ存在しています。たとえば、周波数を21000に設定すると、非常に鋭い声が出る可能性があります。それはJavaの不安定性ですか? –

+0

なぜこのような高い周波数が必要でしょうか? – Syntey

+0

私のUniの私の研究プロジェクトから来ています。私は人々が聞くことができない音を生成する必要があります。 –

関連する問題