BiquadFilterNode:getFrequencyResponse() 方法

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

BiquadFilterNode 介面的 getFrequencyResponse() 方法接收當前的濾波演算法設定,並計算指定頻率陣列中頻率的頻率響應。

在呼叫此方法之前,必須建立兩個輸出陣列 magResponseOutputphaseResponseOutput;它們的大小必須與輸入頻率值陣列(frequencyArray)相同。

語法

js
getFrequencyResponse(frequencyArray, magResponseOutput, phaseResponseOutput)

引數

frequencyArray

一個包含頻率陣列的 Float32Array,頻率以赫茲(Hertz)為單位指定,您希望對其進行濾波。

magResponseOutput

一個 Float32Array,用於接收 frequencyArray 中每個頻率值的計算出的頻率響應幅度。對於 frequencyArray 中值超出 0.0 到 sampleRate/2 範圍(其中 sampleRateAudioContext 的取樣率)的任何頻率,此陣列中的相應值為 NaN。這些值是無單位的。

phaseResponseOutput

一個 Float32Array,用於接收輸入 frequencyArray 中每個頻率值的計算出的相位響應值(以弧度為單位)。對於 frequencyArray 中值超出 0.0 到 sampleRate/2 範圍(其中 sampleRateAudioContext 的取樣率)的任何頻率,此陣列中的相應值為 NaN

返回值

無(undefined)。

異常

InvalidAccessError

提供的三個陣列的長度並不都相同。

示例

在下面的示例中,我們對媒體流使用了一個雙二階濾波器(有關完整演示,請參閱我們的 stream-source-buffer 演示),或 閱讀原始碼)。作為此演示的一部分,我們獲取了這個雙二階濾波器的頻率響應,針對五個取樣頻率。我們首先建立所需的 Float32Array,其中一個包含輸入頻率,另外兩個用於接收輸出幅度和相位值。

js
const myFrequencyArray = new Float32Array(5);
myFrequencyArray[0] = 1000;
myFrequencyArray[1] = 2000;
myFrequencyArray[2] = 3000;
myFrequencyArray[3] = 4000;
myFrequencyArray[4] = 5000;

const magResponseOutput = new Float32Array(5);
const phaseResponseOutput = new Float32Array(5);

接下來,我們在 HTML 中建立一個 <ul> 元素來包含我們的結果,並在 JavaScript 中獲取它的引用。

html
<p>Biquad filter frequency response for:</p>
<ul class="freq-response-output"></ul>
js
const freqResponseOutput = document.querySelector(".freq-response-output");

最後,在建立我們的雙二階濾波器後,我們使用 getFrequencyResponse() 來生成響應資料並將其放入我們的陣列,然後遍歷每個資料集,並將它們以人類可讀的列表形式顯示在頁面底部。

js
const biquadFilter = audioCtx.createBiquadFilter();
biquadFilter.type = "lowshelf";
biquadFilter.frequency.value = 1000;
biquadFilter.gain.value = range.value;

// …

function calcFrequencyResponse() {
  biquadFilter.getFrequencyResponse(
    myFrequencyArray,
    magResponseOutput,
    phaseResponseOutput,
  );

  for (let i = 0; i <= myFrequencyArray.length - 1; i++) {
    const listItem = document.createElement("li");
    listItem.textContent = `: Magnitude ${magResponseOutput[i]}, Phase ${phaseResponseOutput[i]} radians.`;
    listItem.insertBefore(
      document.createElement("strong"),
      listItem.firstChild,
    ).textContent = `${myFrequencyArray[i]}Hz`;
    freqResponseOutput.appendChild(listItem);
  }
}

calcFrequencyResponse();

規範

規範
Web Audio API
# dom-biquadfilternode-getfrequencyresponse

瀏覽器相容性

另見