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

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

    }
    }     

最佳答案

在以下行中:

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

播放数字440。此数字应为您在hz中的频率。我通过消除过程知道这一点,440hz是音频 Realm 的“Hello,World”。

理论听觉范围为20hz至22000hz。 (22khz)

在大多数情况下,如果听力和扬声器正常,您的视线范围是65hz-16000hz

您看到的其他一些内容:

44100-您的采样率

1000-可以肯定,这只是毫秒。因此44100/1000从样本/秒转换为样本/毫秒

Math.sin-使用sin函数根据时间(本质上是您正在使用的样本)创建y值

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

此外,与往常一样,rtfm ...查看文档,并检查传入参数的参数。
 AudioFormat af = new AudioFormat( (float )44100, 8, 1, true, false );

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

如果检查出这些东西会带来更多音频问题,请回击。

-干杯

关于java - 如何在Java中更改音调的频率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25811219/

相关文章:

java - HttpSession 有什么问题?

objective-c - 如何获得当前音量

android - Cordova Media Capture Android 错误 3 号问题

java - 最后的分析失败了。后台任务页面上提供了更多详细信息

java - 无法在 Spring 中通过属性占位符读取属性文件。出现系统找不到指定的文件错误

flash - 用于HTML 5的 `<audio>`和 `<video>`标签的Flash实现?

actionscript - Flash流播放器(教程?)

c++ - 使用 VST 插件失真的音频

java - Android 上 Java lib 和 C++ dll 之间的性能

java - 没有 "try-finally"做 "catch"有意义吗?