2014-09-12 88 views
-3

我正在编写一个程序,我希望它能够播放一个频率。但我不知道在我的代码中,我必须改变什么。如何更改java中的音频频率?

try 
    { 
     byte[] buf = new byte[ 1 ];; 
     AudioFormat af = new AudioFormat((float)44100, 8, 1, true, false); 
     SourceDataLine sdl = AudioSystem.getSourceDataLine(af); 
     sdl = AudioSystem.getSourceDataLine(af); 
     sdl.open(af); 
     sdl.start(); 
     for(int i = 0; i < 1000 * (float)44100/1000; i++) { 
      double angle = i/((float)44100/440) * 2.0 * Math.PI; 
      buf[ 0 ] = (byte)(Math.sin(angle) * 100); 
      sdl.write(buf, 0, 1); 
     } 
     sdl.drain(); 
     sdl.stop(); 
     sdl.close(); 
     } 
    catch (Exception x1) 
    { 

    } 
    }  

回答

2

在下面一行:

double angle = i/((float)44100/440) * 2.0 * Math.PI; 

播放用数字440这个数字应该是赫兹频率的。我通过消除过程知道这一点,440hz是音频领域的“Hello,World”。

理论听觉范围是20hz到22000hz。 (22kHz)环绕

在大多数情况下,正常的听力和扬声器,你正在寻找65HZ-16000HZ

其他有些东西你看到:

44100 - 你的采样率

1000 - 很确定这只是一秒钟的ms。所以千分之四万四千百从样本/秒采样/ MS转换

Math.sin - 创建基于时间(你是什么样的,基本上)与正弦函数

如果你的y值希望在短时间内更好地理解这一点;查找采样率和位深度的定义。

也一如既往,RTFM ...看看文档,并检查了被参数的参数要传递什么。

AudioFormat af = new AudioFormat((float)44100, 8, 1, true, false); 

44100是采样率,但对我来说8, 1,的确,假可能意味着什么。 (8位可能是位深度,16位更常见,1可能意味着单声道...)。

评论回来,如果检查这个东西出来会带来更多的音频问题。

- 片商