如何更改java中音调的频率?

时间:2014-09-12 14:59:20

标签: java audio

我正在编写一个程序,我希望它能够播放频率。但我不知道在我的代码中我必须改变一些东西。

 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)
    {

    }
    }     

1 个答案:

答案 0 :(得分:1)

在以下行中:

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

使用数字440播放。此数字应为您的频率,单位为hz。我通过消除过程知道这一点,440hz是音频领域&#34; Hello,World&#34;。

听力的理论范围是20hz到22000hz。 (22kHz的)

在大多数情况下,通过正常听力和扬声器,您可以看到65hz-16000hz

您正在看到的其他一些事情:

44100 - 您的采样率

1000 - 非常确定这只是一秒钟内的ms。因此44100/1000从samples / sec转换为samples / ms

Math.sin - 使用sin函数创建基于时间的y值(基本上是你的样本)

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

此外,与往常一样,rtfm ...查看文档并查看您传入的参数的参数。

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

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

回顾如果检查这些东西会带来更多的音频问题。

-Cheers