本文章是由機器翻譯。

DirectX 要素

探索 XAudio2 中的篩選器

Charles Petzold

下載代碼示例

在著名的波形的萬神殿,簡單的正弦曲線至高無上。只是看著它,您可以看到其精髓的順利起伏性質 — — 當它達到其峰值、 幾乎停止,它冠,然後逐步加快速度減慢,達到它的最大速度橫渡水準軸開始另一個經濟放緩。

這種視覺印象更深的數學分析所證實。正弦曲線在任意點的暫態速度是對曲線切線。圖的那些速度,並可以得到另一個正弦曲線,由四分之一週期從原始偏移。不要再使用這第二條曲線,它和那是顯示加速度,偏移量從原來的半個週期,如中所示的正弦曲線圖 1


圖 1 正弦曲線,其 (在紫羅蘭色) 中速度與加速度 (Aqua)

在微積分術語中,正弦曲線是它自己的二階導數的負值。從基本物理學,我們知道部隊是加速度,這意味著在任何物理過程中力在哪裡與位移成反比,議案由正弦曲線描述成正比。泉具有這一特點:越多你舒展了他們,更該部隊在相反的方向。但自然界中發現的許多其他物質有內在彈性,以及包括壓縮和稀疏的空氣。

考慮採摘的繃緊的字串的被拉伸的動物皮膚,管道內空氣的振動攻絲。所有這些過程涉及彈性振動與正弦曲線的特徵運動的物件。更常見的是,這個正弦曲線被輔以額外的正弦曲線,其頻率是基本頻率的整倍數。在此組合中,正弦曲線被稱為諧波。

本身,單個正弦曲線是可聽見很無聊。但把他們幾個一起在諧波關係和聲音獲取有趣得多。現實生活中,很多時候這些諧波的頻率的基頻,確切積分並不更加正確地被稱為的言外之意。這是這個組合的言外之意 — — 包括它們隨時間的變化 — —,它定義一種樂器的特徵的聲音或音色。

一個特定波形的一個小片段可以被繪製成圖作為函數的時間,在頂部所示圖 2。如果此波形重複每 4 ms,它有一個 250 Hz,這是接近中間 C 在鋼琴上的頻率。


圖 2 波形在時間域 (頂部) 和頻率域 (底部)

一些傅裡葉分析,我們可以將此波形分成其組成的正弦曲線,和代表它有些不同的方式,在底部所示圖 2。此關係圖中顯示頻率由安排這些構成正弦曲線相對的振幅。在信號處理的行話, 圖 2 顯示波形的時域表示形式的等價性上頂部和底部的頻率域表示形式。

在現實生活中的聲音中其頻率域表示形式將包含整個音訊譜從 20 赫茲到 20000 赫茲,和時間推移不斷變化。

篩選器基礎知識

頻率域表示允許我們認為的聲音作為集合的各種不同頻率的正弦波,這往往有助於人們理解音訊處理。

一種非常常見的音訊處理涉及放大或衰減某頻率範圍的音訊頻譜中,從而改變聲音的諧波組成。這是一個稱為一個篩選器的工具。在類比信號處理中,篩選器是電路 ; 他們在數位信號處理演算法。

最常見的篩選器類型,因此稱為低通、 高通和帶通 ; 術語的頻率是指讓通過的篩選器。低通濾波器強調較低頻率的衰減更高的頻率。同樣,高通濾波衰減較低的頻率。低通和高通篩檢程式定義特定的截止頻率,指示衰減的開始位置。帶通濾波器沒有截止頻率,但中心頻率起類似的作用。圍繞該中心頻率範圍以外的頻率是弱毒疫苗。

大多數篩選器不能簡單地阻止所有高於或低於特定頻率的正弦波。相反,與特定頻率的正弦波被削弱基於其距離截止或中心頻率與一個滾的作用了。這滾坡受稱為 Q,品質為站立的篩選器的屬性。具有較高的 Q 的篩選器已陡滾。

Q 因數是最簡單的解釋與帶通濾波器。圖 3 顯示的帶通濾波器的頻率範圍的應用效果。中心頻率 f0,在標記和其他兩個頻率標記為 f1 和 f2 哪裡帶通濾波器衰減為 70.7 %f0 振幅的振幅。


圖 3 中帶通濾波器的頻寬

為什麼 70.7%嗎?作為波形的振幅的平方計算的波形力量和 f1 和 f2 表示一半它原始的力量在波形已被減毒的頻率。因為電源是振幅平方,在那些點的振幅是 1/2 或 0.707 的平方根。

Q 值是計算方法的中心頻率除以兩個半功率頻率之間的差異:

Q = f0 / (f2 — — f1)

然而,f2 和 f0 之間的區別不是 f0 和 f1 之間的區別一樣。相反,比率是相同的:f2 / f0 等於 f0 / f1。如果 f2 為雙 f1,這就是倍頻程,並且它是很容易計算 Q 等於平方根的 2,或大約 1.414。

F1 與 f2 的比例被稱為篩選器的頻寬,和經常在八度音階中指定。頻寬 B 在八度音階中,您可以計算 Q 就像這樣:

隨著頻寬的下降,Q 增加和滾是更加陡峭。

我說過 f2 和 f1 是篩選器衰減一半權力的 f0 的頻率。一半的權力也被稱為是-3 分貝。分貝是響度的大致逼近人類認知對數刻度。兩個電源級別 P1 和 P0 的分貝的區別是:

db = 10·log10(P1/P0)

如果 P1 是半 P0,0.5 的基地 10 對數是-0.301 和是大約-3 的 10 倍。當處理振幅,分貝計算為:

db = 20·log10(A1/A0)

0.707 的基地 10 對數是-0.15 和也是-3 的 20 倍。

每增加一倍的振幅對應增加 6 分貝,這就是為什麼有時說 16 位取樣速率的音訊 Cd,有 96 分貝的動態範圍。

應用篩選器

如果您使用 XAudio2 在 Windows 8 的程式中生成聲音或修改現有的音樂檔的聲音,將篩選器應用於那些聲音是作為初始化的 XAUDIO2_FILTER_PARAMETERS 結構的三個欄位和調用名為 SetFilterParameters 的方法一樣簡單。

如你所見在此列的最近分期付款,程式創建一個或多個實例的 IXAudio2SourceVoice 來定義波形本身、 和 IXAudio2 的單個實例­MasteringVoice 要有效地將所有的源聲音合併到單個音訊流。本文中稍後介紹你還會看到如何創建實例的 IXAudio2SubmixVoice 來控制處理和混合的途中掌握語音的聲音。源聲音和 submix 聲音支援的 SetFilterParameters 方法,但只有如果聲音創建了 XAUDIO2_VOICE_USEFILTER 標誌。

對 SetFilterParameters 的調用需要指向 XAUDIO2_FILTER_PARAMETERS 結構,有三個欄位的指標:

類型:將設置為 XAUDIO2_FILTER_TYPE 枚舉,其中包括低通、 高通和帶通濾波器,以及一個槽口 (或樂隊-拒絕) 篩選器的成員和單極低通和高通篩檢程式,(如你很快就會看到) 是更簡單的篩選器的成員之一。

[頻率 (Frequency)]:設置為 2·sin(π·f0/fs),其中 f0 是截止頻率,fs 是採樣頻率,哪裡 f0 不大於 1/6 的 fs,這意味著的值設置為該欄位是不大於 1。

OneOverQ:1 除以所需的 Q 因數,大於零且不大於 1.5。因此,Q 不能少於 2/3,它對應于 2 倍頻程的頻寬。

我還沒給你圖,類似于圖 3,這說明低通和高通篩檢程式如何衰減的頻率。有時這種圖只是顯示一個滾的作用,因而可以危險地欺騙性如果那樣的實際篩選器不相當的工作。是這種情況與 XAudio2 篩檢程式。低通、 高通、 帶通和槽口的篩選器,為 XAudio2 實現數位濾波器稱為二階,其中涉及到一個相當簡單的演算法,但不會創建一個簡單的滾效果低通和高通濾波器的類型。(如果你有興趣在演算法中,按照維琪百科文章中的連結上"數位二階濾波器"在 bit.ly/Yoeeq1.)

二階濾波器往往在中心頻率的帶通濾波器和附近的低通和高通濾波器的截止頻率產生共鳴。這意味著該篩選器減輕一些頻率,不僅放大了別人。要明智地使用這些篩選器,您必須意識到這種效果。幸運的是,此放大是相當容易預測。對於帶通濾波器,在中心頻率的正弦波的振幅等於 Q 的一個因素的增加。對於低通和高通濾波器,截止頻率附近的最大放大是等於 Q 的較高值的 Q,但稍大於 Q 為較低的值。

圖 4 顯示所有 XAudio2 篩選器類型為 261.6 Hz (中間 C) 和 Q 的 1.414 的頻率設置的影響。水準軸是與一系列的 3 倍頻程的上方和下方中間 C.對數垂直軸顯示在這些頻率的正弦曲線的合成振幅。1 的振幅在黑色水平線是沒有篩選器。其他所有行用不同的顏色都標識。


圖 4 為 Q 的 1.414 篩選器的影響

例如,低通濾波器頻率低於截止頻率,通過讓不僅放大了他們,並此放大增加你接近截止頻率。高通濾波器具有相反的效果。

圖 5 是類似于圖 4 但為 4.318 Q,其中與關聯的 1/3 倍頻程的頻寬。請注意在垂直軸不同以容納增加的擴增。


圖 5 為 Q 的 4.318 篩選器的影響

如果您想要使用的簡單的低通或高通篩選器不會在所有放大,堅持單極的篩選器。這些都是非常簡單的篩選器只是受截止頻率和他們不使用 Q 設置。他們多函數一樣的簡單的低音和高音控制汽車音響。但如果你想要使用更複雜的篩選,通過篩選您的程式必須補償任何擴增。

如果您而是將實現您自己的篩檢程式,你可以做的以及通過創建 XAudio2 音訊處理物件 (XAPO),這是一個類,獲取對音訊流的訪問,並且可以實現效果。

看著卷

若要允許我 (和你) 試驗用的篩選器,我創建了一個名為 AudioFilterDemo 在這篇文章的可下載代碼中包含的 Windows 8 專案。圖 6 說明它的運行。


圖 6 AudioFilterDemo 程式

向頂部的三個振盪器是所有獨立可控的、 與一個包含任一側的中間 C.3 倍頻程的頻率範圍滑塊是對數刻度但可調到筆記之間 10 司,這是一個增量稱為 10 美分。

篩選器有一個頻率滑塊,以及一個滑塊為 Q。所有頻率滑塊都有工具提示標識說明和它的頻率。圖 7 顯示的方法,在三個波形源聲音設置的篩選器,當有在控制項中的更改時。

圖 7 AudioFilterDemo 設置 XAudio2 篩選器參數

void MainPage::SetFilterParameters()
{
  if (pSawtoothOscillator != nullptr)
  {
    XAUDIO2_FILTER_PARAMETERS filterParameters;
    if (currentFilterType != -1)
    {
      double cutoffFrequency =
        440 * pow(2, (filterFrequencySlider->Value - 69) / 12);
      filterParameters.Type = XAUDIO2_FILTER_TYPE(currentFilterType);
      filterParameters.Frequency =
        float(2 * sin(3.14 * cutoffFrequency / 44100));
      filterParameters.OneOverQ = float(1 / filterQSlider->Value);
    }
    else
    {
      // Documentation:
      // "acoustically equivalent to the filter being fully bypassed"
      filterParameters.Type = LowPassFilter;
      filterParameters.Frequency = 1.0f;   
      filterParameters.OneOverQ = 1.0f;
    }
    pSawtoothOscillator->GetVoice()->SetFilterParameters(
      &filterParameters, XAUDIO2_COMMIT_ALL);
    pSquareWaveOscillator->GetVoice()->SetFilterParameters(
      &filterParameters, XAUDIO2_COMMIT_ALL);
    pSineWaveOscillator->GetVoice()->SetFilterParameters(
      &filterParameters, XAUDIO2_COMMIT_ALL);
  }
}

底部面板是縮放的分貝音量儀。這使您可以看到由此產生量為特定的波形和篩選器設置。該程式使得沒有調整到使用者設置通過以外的其他卷。如果這種流量計進入紅色的這意味著程式產生了一種聲音,是太吵了,和之前的音響系統在您的電腦上被剪切波形。

音量儀基於預定義的效果的類。圖 8 顯示了用於創建這種效果的實例的代碼。該程式然後設置一個計時器,並調用 GetEffectParameters 以獲取自上次調用 GetEffectParameters 輸出聲音的峰值水準。

圖 8 創建卷米效果

// Create volume meter effect
IUnknown * pVolumeMeterAPO;
XAudio2CreateVolumeMeter(&pVolumeMeterAPO);
// Reference the effect with two structures
XAUDIO2_EFFECT_DESCRIPTOR effectDescriptor;
effectDescriptor.pEffect = pVolumeMeterAPO;
effectDescriptor.InitialState = true;
effectDescriptor.OutputChannels = 2;
XAUDIO2_EFFECT_CHAIN effectChain;
effectChain.EffectCount = 1;
effectChain.pEffectDescriptors = &effectDescriptor;
// Set the effect on the mastering voice
pMasteringVoice->SetEffectChain(&effectChain);
// Release the local reference to the effect
pVolumeMeterAPO->Release();

在此程式中一個有趣的行使是通過與 Q 的至少 4 種左右的帶通濾波器發揮方波或鋸齒波。當您更改篩選器頻率,你可以聽到個別言外之意的波形。方波僅奇數諧波,但鋸齒波有奇數和偶數的諧波。

圖形等化器

時間是,每個設備齊全的家庭音訊安裝包括包含行的垂直幻燈片電位器控制銀行的帶通濾波器圖形等化器。在一個圖形等化器,每個帶通濾波器涵蓋的三分之二或八度總音訊頻譜中的三分之一。各專業的音響工程師,圖形等化器用於通過刺激或切割各種頻率調整的聲學回應的一個房間。家庭使用者經常安排"微笑"的模式中的滑塊,仿效的在圖 9、 刺激、 低、 高兩端和離開的中間範圍較軟,不過分干擾的談話。


圖 9 GraphicEqualizer 程式

GraphicEqualizer 程式允許您從您的 Windows 8 的音樂庫載入 MP3 或 WMA 檔並播放它通過一個 1/3 倍頻程圖形等化器。該套裝程式含 26 垂直滑塊,其中每個是帶通濾波器與相關聯。正如您所看到的每個滑塊都標有在這一波段的中心頻率。在理論上,每個中心頻率應該是多維資料集的根 2 (或約 1.26) 雇用比以前的篩選器,但很多的舍入高要保持合理的數位。基於我在維琪百科發現的 1/3 圖形等化器的一張照片,我標記為 20 hz,25、 31.5、 40 開始 26 滑塊,穿過 6.3 千赫,停止 44,100 Hz 取樣速率的 7,350 Hz 限制。

最圖形等化器有單獨的帶區的電位器為左、 右通道,但我決定放棄那美化市容。

你見過怎麼一個篩選器可應用於一個特定的 IXAudio2SourceVoice 實例,但 GraphicEqualizer 程式需要將 26 篩選器應用於源的聲音。這通過創建 26 IXAudio2SubmixVoice 實例對應于這些篩選器 (加上幾個),並創建什麼叫做 XAudio2"音訊處理圖",如中所示圖 10。每個框是一個派生自 IXAudio2Voice,三個介面的實例,框中標識的 GraphicEqualizer 程式中使用的變數名稱。


圖 10 在 GraphicEqualizer Program 中使用的音訊處理圖

IXAudio2SubmixVoice 實例無法生成其自己的聲音。這種特權被保留給源的聲音。但它可以獲取輸入從一個源的聲音 (或另一個 submix 語音) ; 應用卷、 篩選器或影響 ; 結果到一個或多個 submix 聲音,或掌握的聲音傳遞。

在頂部的圖 10 就是從音樂檔生成音樂的源聲音。在底部是掌握的聲音的結果發送到電腦的聲音硬體。兩者之間是所有 submix 聲音。

它是一個推模型:每當你創建一個源的聲音或 submix 語音,您可以指示目標的聲音 (或聲音) 您想要接收的那聲音輸出。稍後,您可以更改該輸出與對 SetOutputVoices 的調用的目標。如果您指定 Null 在任一情況下,輸出去掌握的聲音。

您指明您要輸出的語音與指標去 XAUDIO2_VOICE_SENDS 結構,其中包含兩個欄位:

  • SendCount 的不帶正負號的整數類型
  • pSends,是零個或更多的 XAUDIO2_VOICE_DESCRIPTOR 結構的指標

SendCount 指示由 pSends 指向 XAUDIO2_VOICE_DESCRIPTOR 結構的數目。它可以是零,以表明聲音不去任何地方。XAUDIO2_VOICE_DESCRIPTOR 結構也有兩個欄位:

  • 標誌,可以是 0 或 XAUDIO2_SEND_USEFILTER
  • pOutputVoice,IXAudio2Voice 類型的

喂進了銀行的 26 submix 聲音和一個能整合這些 26 的聲音,從輸出的兩個 IXAudio2SubmixVoice 實例生成圖形等化器,並不嚴格所需,但它們簡化了程式的結構。無論何時,程式會創建一個新的源聲音 — — 每當使用者載入一個新的音樂檔中發生這種情況 — — 它只是需要直接源聲音的輸出到 pSourceVoiceOutput 的實例。

該程式還具有一個核取方塊按鈕來繞過等化器。要斷開音訊處理圖形等化器,一切必要是在同一個 Null 指標,指示它應該去掌握語音 pSourceVoiceOutput 上調用 SetOutputVoices。恢復等化器涉及到幾個程式碼來還原輸出從 pSource­VoiceOutput 到 pEqualizerInput。

有幾種的方法來定義的篩選器,包括圖形等化器。一種方法是為每個滑塊以更改該篩選器的 Q — — 實際上這會使篩選器更具限制性的當你增加滑塊。但我決定要在 1/3 倍頻程頻寬或 4.318,保持每個篩選器的 Q 因數和使用滑塊來改變那 submix 聲音的音量。圖形等化器通常允許切換滑塊的銀行之間 ± 6 dB 範圍和 ±12 dB 的範圍,但是我決定在一個 ±24 dB 範圍為更多的極端效果上。

在其中心位置等化器滑塊時,相應的 submix 聲音已 1 預設卷。通常,這將意味著聲音只是通過 submix 聲音不變。但是,應用與 Q 4.318 submix 聲音中的篩選器導致的振幅由在中心 fre 4.318 因素增加­淬火。要補償,該程式將 submix 聲音 pEqualizerOutput 的音量設置為 1 除以 Q。

與所有的滑塊設置在他們的中心位置,按一下該核取方塊可切換的等化器和音訊圖卷中導致沒有變化。聲音不會改變一點 — —­無疑產生的方式的各種帶通濾波器重疊 — — 但總體音量不會。

等化器滑塊設置為-24 其最低屬性和最大值設置為 24,對應的增益的分貝。當滑塊的值更改,卷為相應 submix 語音設置在 ValueChanged 事件處理常式中,像這樣:

Slider^ slider = dynamic_cast<Slider^>(sender);
int bandIndex = (int)slider->Tag;
float amplitude = float(pow(10, (args->NewValue / 20)));
pEqualizerBands[bandIndex]->SetVolume(amplitude, 0);

那幅計算是逆的前面顯示的分貝計算。 由此產生的振幅範圍從大約 0.06 (在-24 dB) 到約 16 (在 24 dB)。 如果你請記住,每個更改的 6 dB 是減半或加倍的中心振幅的 1,這些範圍有意義。 但如果你搖晃了所有將滑塊拖到其最大設置,整體振幅增加 16 的一個因素,結果很可能會被剪裁和扭曲。

換句話說,該程式隱式假定使用者保持平衡的生活方式,並將降低,同時增加其他一些滑塊。

CharlesPetzold 是 MSDN 雜誌和作者的"程式設計視窗,第 6 版"的長期貢獻 (O'Reilly 媒體,2012年),一本關於編寫應用程式的 Windows 8 書。 他的網站是 charlespetzold.com

由於以下的技術專家對本文的審閱:理查 · Fricks (Microsoft)