从音频文件中获取频率表示

get frequency representation from audio file

我正在尝试获取 wav 文件的 fft。问题是我的频谱一直是无穷大。接收回无限意味着没有源连接到分析仪。我认为我的问题在于我如何在源变量中构建音频源。 我的代码可用 here

<html>
<body>
    <input id="fileItem" type="file">

<script>
var audioContext = new AudioContext();
    
//Create analyser node
const analyserNode =  audioContext.createAnalyser();
analyserNode.fftSize = 256;
const bufferLength = analyserNode.frequencyBinCount;
const dataArray = new Float32Array(bufferLength);
    
//setup audio souce
var source = audioContext.createBufferSource();

//Set up audio node network
source.connect(analyserNode);
analyserNode.connect(audioContext.destination);    
    
var openFile = function(event) {
var input = event.target;

var reader = new FileReader();
reader.onload = function(){
var arrayBuffer = reader.result;
  console.log("arrayBuffer:");
  console.log(arrayBuffer);
  audioContext.decodeAudioData(arrayBuffer, decodedDone);
    
};
reader.readAsArrayBuffer(input.files[0]);
};
function decodedDone(decoded) {

  // set the buffer in the AudioBufferSourceNode    
  source.buffer = decoded;
  source.connect(analyserNode);
  source.start();

  //Get spectrum data
  analyserNode.getFloatFrequencyData(dataArray);
  console.log(dataArray)    


 var typedArray = new Float32Array(decoded.length);

typedArray=dataArray//decoded.getChannelData(0);
console.log("typedArray:");
console.log(typedArray);

}
    
    
document.querySelector("#fileItem").onchange= openFile

</script>
</body>
</html>

这里有几个问题。您将 source 连接到 analyserNode 两次。无害,但没必要。

我认为真正的问题是您启动源然后立即请求频率数据。还没有时间允许源生成数据,因此 AnalyserNode 的内部缓冲区仍然全为零,因此输出为无穷大。

作为测试,使用 setTimeout 或其他方法暂停一下(尝试至少 10 毫秒左右),然后您应该会看到并非全部为无穷大的值。