我正在開發一個Android應用程序。我想要生成頻率範圍在1KHz到20KHz之間的聲音。無論如何,在特定頻率下產生聲音。如何生成特定的聲音頻率?
回答
我從另一個SO帖子發現了這段代碼。從我可以告訴它仍然是一個小錯誤,但它應該做的伎倆。
public class PlaySound extends Activity {
// originally from http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html
// and modified by Steve Pomeroy <[email protected]>
private final int duration = 3; // seconds
private final int sampleRate = 8000;
private final int numSamples = duration * sampleRate;
private final double sample[] = new double[numSamples];
private final double freqOfTone = 440; // hz
private final byte generatedSnd[] = new byte[2 * numSamples];
Handler handler = new Handler();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
protected void onResume() {
super.onResume();
// Use a new tread as this can take a while
final Thread thread = new Thread(new Runnable() {
public void run() {
genTone();
handler.post(new Runnable() {
public void run() {
playSound();
}
});
}
});
thread.start();
}
void genTone(){
// fill out the array
for (int i = 0; i < numSamples; ++i) {
sample[i] = Math.sin(2 * Math.PI * i/(sampleRate/freqOfTone));
}
// convert to 16 bit pcm sound array
// assumes the sample buffer is normalised.
int idx = 0;
for (final double dVal : sample) {
// scale to maximum amplitude
final short val = (short) ((dVal * 32767));
// in 16 bit wav PCM, first byte is the low order byte
generatedSnd[idx++] = (byte) (val & 0x00ff);
generatedSnd[idx++] = (byte) ((val & 0xff00) >>> 8);
}
}
void playSound(){
final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
sampleRate, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, numSamples,
AudioTrack.MODE_STATIC);
audioTrack.write(generatedSnd, 0, generatedSnd.length);
audioTrack.play();
}
}
heh。我只是在這裏找到了同樣的東西(http://marblemice.blogspot.com/2010/04/generate-and-play-tone-in-android.html)。假設代碼在該鏈接處更新以修復錯誤。 – 2012-01-02 08:12:54
是的,但根據評論它仍然有一些......無論哪種方式,它是一個偉大的基地。 – Reid 2012-01-02 08:15:33
這個代碼有問題,因爲即使你設置了sampleRate = 44100,它也不能播放超過17000Hz的任何東西。這些相同的算法在Flash中工作,例如我使用的手機可以播放這些頻率,當它們來自文件。有誰知道如何解決這一問題? – PSIXO 2013-09-09 13:07:06
- 1. 在ubuntu中使用gcc生成特定頻率的聲音?
- 2. 如何檢測iPhone中特定聲音的聲音頻率?
- 3. 如何在Java中按頻率生成聲音?
- 4. 如何生成圖像噪聲頻率?
- 5. 如何讓iPhone產生指定頻率和幅度的聲音?
- 6. AurioTouch2聲音頻率
- 7. 如何通過MATLAB生成由不同頻率滑行段組成的聲音?
- 8. 檢測音頻中的特定聲音
- 9. JavaScript WebAudio生成多個頻率的聲音
- 10. 聲音的FFT頻率
- 11. 不同頻率的聲音
- 12. 生成特定持續時間內頻率的斜坡音頻信號
- 13. 生成正確的音高頻率值
- 14. Android:如何生成頻率?
- 15. iPhone:檢測特定頻率(幅度)的複製聲音
- 16. 聲音頻率檢測
- 17. 播放特定頻率的音符
- 18. 如何在Nexys ddr 4 FPGA上生成音頻聲音輸出
- 19. 頻率音調發生器播放錯誤的聲音
- 20. html5音頻。如何獲得比特率
- 21. 在手機中以特定頻率發出聲音
- 22. 檢測原始音頻(PCM)中的特定頻率/音調
- 23. 如何生成不同頻率的連續音調?
- 24. 音頻編程,生成和聲
- 25. 在Android上生成高頻聲音
- 26. 如何檢測iPhone上的聲音頻率/音高?
- 27. YouTube視頻中的音頻比特率?
- 28. 如何在Python中以給定的頻率和音量繼續播放聲音?
- 29. 在iPhone上獲取聲音的頻率
- 30. 如何通過特定的聲卡播放音頻?
您描述的範圍不是超聲波。即它仍然可以被聽到。 – Sjoerd 2012-01-02 08:04:21
只是挑剔:超聲波_starts_在20KHz。你想要的範圍內的頻率是聲學的。 – 2012-01-02 08:04:59
@alextsc,如果它在BlackBerry或Java-ME中,那麼也歡迎回答。 – Android 2012-01-02 08:05:26