Java播放错误的声音频率

标签 java audio frequency javasound waveform

我正在编写一个从一个频率线性转换到另一个频率的 java 声音应用程序。

当我输入固定频率(也就是第一个和最后一个频率相同)时,会播放正确的频率。

但是,只要两个频率之间的差异大于零,播放的频率就会从正确的值开始,但以双倍的速率增加,并以双倍的差异结束。(例如我输入 500 和 1000;频率从 500 开始到 1500 结束。

我最初认为我只是错误地增加了频率,但是当我打印频率值时,它打印出我想要的值(例如,我输入 500 和 1000;打印输出从 500 开始到 1000 结束)。

我通过记录输出声音并在频谱图上查看其频率来检查可听频率的值。这是我的代码的相关简化部分:

import java.lang.Math;
import javax.sound.sampled.*;

public class MainSpeech {

    public static void main(String[] args) throws LineUnavailableException {

        double freq; //  frequency in Hz
        int volume = 30;
        int time = 1; // in seconds
        float sampleRate = 8000.0f; // in Hz
        int numSamples = (int)(sampleRate * time); // # of samples within given time
        byte stream[] = new byte[(int)(sampleRate*1)]; // waveform values

        freq = 700;
        for (int i = 0; i < numSamples; i++) {
            freq += 0.1;
            stream[i] = (byte) (Math.sin(2*Math.PI*i*freq/sampleRate)*volume);
        }

        AudioFormat af = new AudioFormat(sampleRate, 8, 1, true, false);
        SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
        sdl.open(af);
        sdl.start();
        sdl.write(stream, 0, stream.length); // play sound
        sdl.drain();
        sdl.close();
    }
}

在这个简化的片段中,频率应该从 700 开始,然后以 0.1 增加八千次,以 1500 的频率结束,打印输出正确显示。然而可听频率实际上结束于2300。

最佳答案

你这里有错误:

2*Math.PI*i*freq/sampleRate

在这里使用 i 或 freq,但不要两者。你所拥有的不是频率的线性变化,而是二次方的。如果您希望它的行为如下所述,请使用

2*Math.PI*freq/sampleRate

关于Java播放错误的声音频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14228331/

相关文章:

java - 如何根据变量值对 ArrayList 进行排序

c# - 使用 C++ 保存 wav 文件时音频数据不正确(基于 C# 程序)

java - 计算数组中数字的频率

linux - 如何计算位于小网格中的元素的频率?

java - 将频率应用于数组中的元素

java - Play framework 1.2.5应用启动慢

java - 如何检查AWS SQS连接空闲时间

java - 在java中检查文件类型(csv或excel文件(xlsx))

python - pyFluidsynth 'module' 对象没有属性 'Synth'

javascript - 使用 Web Audio API 创建完整轨道的波形