【发布时间】:2011-06-10 03:58:54
【问题描述】:
我想将声音的音高绘制成图表。
目前我可以绘制幅度。下图是由getUnscaledAmplitude()返回的数据创建的:
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 似乎得到了音调,但它需要知道比我拥有的原始字节更多的变量,并且非常复杂和数学。
有什么办法可以做到吗?
【问题讨论】:
-
你想获取频域信息,但不想使用THE方法获取?
-
@Coronatus:对不起,这并不是要咄咄逼人,只是很感兴趣。您似乎拒绝将 FFT 作为一种方法,但没有真正详细说明您认为它的缺点......
-
是的,它非常复杂且具有数学意义,但它正是您所需要的,如果您阅读 Wikipedia,您就会明白它为何如此重要。你的工作是让你的数据使用它。故事结束。
-
如果有任何帮助,FFT 实际上只是实现 DFT (en.wikipedia.org/wiki/Discrete_Fourier_transform) 的一种有效方式,它更容易编写(但运行在 O(N^2) 而不是比 O(N log N))。
-
您需要显示音高还是频谱?前者非常棘手,其准确性很大程度上取决于输入提供的内容。后者已经做了无数次,FFT 是要走的路。查看dspdimension.com/admin/dft-a-pied。不是关于 FFT,而是用简单的语言教你基础知识
标签: java audio fft frequency pitch