gpt4 book ai didi

java - 绘制声音的音高(频率)

转载 作者:IT老高 更新时间:2023-10-28 20:54:56 35 4
gpt4 key购买 nike

我想将声音的音高绘制成图表。

目前我可以绘制幅度。下图是由 getUnscaledAmplitude() 返回的数据创建的:

alt text

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new BufferedInputStream(new FileInputStream(file)));
byte[] bytes = new byte[(int) (audioInputStream.getFrameLength()) * (audioInputStream.getFormat().getFrameSize())];
audioInputStream.read(bytes);

// Get amplitude values for each audio channel in an array.
graphData = type.getUnscaledAmplitude(bytes, 1);


public int[][] getUnscaledAmplitude(byte[] eightBitByteArray, int nbChannels)
{
int[][] toReturn = new int[nbChannels][eightBitByteArray.length / (2 * nbChannels)];
int index = 0;

for (int audioByte = 0; audioByte < eightBitByteArray.length;)
{
for (int channel = 0; channel < nbChannels; channel++)
{
// Do the byte to sample conversion.
int low = (int) eightBitByteArray[audioByte];
audioByte++;
int high = (int) eightBitByteArray[audioByte];
audioByte++;
int sample = (high << 8) + (low & 0x00ff);

toReturn[channel][index] = sample;
}
index++;
}

return toReturn;
}

但我需要显示音频的音高,而不是幅度。 Fast Fourier transform似乎得到了音调,但它需要知道比我拥有的原始字节更多的变量,并且非常复杂和数学。

有什么办法可以做到吗?

最佳答案

频率(客观指标)与音高(主观量)不同。一般来说,音高检测是一个非常棘手的问题。

假设您现在只想绘制频率响应,您别无选择,只能使用 FFT,因为它是 THE 方法来获得时域数据的频率响应。 (嗯,还有其他方法,例如离散余弦变换,但它们同样难以实现,而且更难以解释)。

如果您在实现 FFT 时遇到困难,请注意它实际上只是一种计算离散傅里叶变换 (DFT) 的有效算法;见 http://en.wikipedia.org/wiki/Discrete_Fourier_transform .基本的 DFT 算法要​​简单得多(只有两个嵌套循环),但运行速度要慢 很多(O(N^2) 而不是 O(N log N))。

如果您想做比简单地绘制频率内容更复杂的事情(例如音高检测或窗口化(如其他人建议的那样)),恐怕您将了解数学的含义。

关于java - 绘制声音的音高(频率),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4708613/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com