簡體   English   中英

從頭開始創建 DSP 系統

[英]Creating a DSP system from scratch

我喜歡電子音樂,我對它的節奏很感興趣。 我在可用於播放音頻、過濾器等的庫上的 Stack Overflow 上發現了很多有用的問題。但我真正好奇的是實際情況如何:數據是如何在效果器和振盪器之間傳遞的? 我已經對 dsp 的數學方面進行了研究,我已經解決了這個問題,但我不確定要使用什么緩沖系統等。最終目標是有一個簡單的 object 效果和振盪器層次結構傳遞數據彼此之間(如果我最終沒有拔出所有頭發試圖實現它,可能會使用多線程)。 它不會成為下一個 Propellerhead 原因,但我對它的工作原理很感興趣,這更像是一種練習,而不是最終產品。

目前我使用 .net 和 C# 並且我最近學習了 F# (這可能會或可能不會導致一些有趣的方法來處理數據)但如果有必要,我可以學習另一個不適合工作的系統。

問題是:使用緩沖區通過程序獲取大量信號數據的最佳方法是什么? 例如,使用隊列、數組、鏈表等會更好嗎? 每次我對系統應用效果時,我應該使樣本不可變並創建一組新數據,還是只編輯緩沖區中的值? 我應該有一個調度程序/線程池樣式 object 來組織傳遞數據,還是效果函數應該直接在彼此之間傳遞數據?

謝謝。

編輯:另一個相關的問題是我將如何使用 windows API 來播放這個數組? 我真的不想使用 DirectShow,因為微軟現在幾乎讓它死了

EDIT2:感謝所有答案。 在查看了所有技術之后,我將使用 XNA 4(我花了一段時間在互聯網上搜索並找到了解釋如何操作的網站)或 NAudio 到 output 音樂......不確定哪一個,取決於有多先進系統最終成為。 當 C# 5.0 發布時,我將使用它的異步功能在此基礎上創建效果架構。 我幾乎平等地使用了每個人的答案,所以現在我有一個難題,誰應該給予賞金......

你看過 VST.NET (http://vstnet.codeplex.com/) 嗎? 這是一個使用 C# 編寫 VST 的庫,它有一些示例。 您還可以考慮編寫 VST,以便可以從任何主機應用程序使用您的代碼(但即使您不想要,查看他們的代碼也很有用)。

信號數據通常很大,需要大量處理。 不要使用鏈表,我知道的大多數庫只是使用數組來放置所有音頻數據(畢竟。這就是聲卡所期望的)。

來自 VST.NET 示例:

    public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)
    {
        VstAudioBuffer audioChannel = outChannels[0];

        for (int n = 0; n < audioChannel.SampleCount; n++)
        {
            audioChannel[n] = Delay.ProcessSample(inChannels[0][n]);
        }
    }

audioChannel 是一個非托管 float* 緩沖區的包裝器。

您可能將樣本存儲在不可變數組中。 然后,當您想播放它們時,您復制 output 緩沖區中的數據(如果需要,更改頻率)並在此緩沖區中執行效果。 請注意,您可以使用多個 output 緩沖區(或通道)並在最后對它們求和。

編輯

我知道播放陣列的兩種低級方法:來自 Windows API 的 DirectSound 和 WaveOut。 C# 使用 DirectSound 的示例 C# 示例與 WaveOut 但是,您可能更喜歡使用外部更高級別的庫,例如NAudio NAudio 便於 .NET 音頻操作 - 請參閱此博客文章以向聲卡發送正弦波。 你可以看到他們也在使用一個浮點數組,這是我推薦的(如果你使用字節進行計算,你最終會在聲音中產生很多混疊)。

F# 在這里可能是一個不錯的選擇,因為它非常適合操作函數。 函數可能是信號創建和處理的良好構建塊。

F# 通常也擅長操縱 collections,尤其是 arrays,這要歸功於 Array 模塊中的高階函數。

這些品質使 F# 在金融領域很受歡迎,我猜對信號處理也很有用。

Visual F# 2010 for Technical Computing有一個專門介紹傅里葉變換的部分,這可能與您想做的事情相關。 不過,我想網上有很多關於轉換的免費信息。

最后,要播放樣本,您可以使用XNA 我認為API(4.0)的最新版本也允許錄制,但我從未使用過。 Xbox 上有一個著名的音樂編輯應用程序,名為ezmuse+ Hamst3r Edition ,它使用 XNA,所以這絕對是可能的。

關於緩沖和異步/線程/同步問題,我建議您查看新的 TPL 數據流庫。 憑借其塊原語、並發數據結構、數據流網絡、異步消息處理和 TPL 基於任務的抽象(可與 async/await C# 5 功能一起使用),它非常適合此類應用程序。

我不知道這是否真的是你想要的,但這是我在大學時的個人項目之一。 在我自己實現之前,我並沒有真正理解聲音和 DSP 是如何工作的。 我試圖盡可能靠近揚聲器,所以我只使用 libsndfile 來為我處理復雜的文件格式。

基本上,我的第一個項目是創建一個大型雙精度數組,用正弦波填充它,然后使用 sf_writef_double() 將該數組寫入文件以創建可以播放的內容,並在波形編輯器中查看結果。

接下來,我在 sine 調用和 write 調用之間添加了另一個 function 以添加效果。

這樣您就可以開始使用非常低電平的振盪器和效果器,並且可以立即看到結果。 另外,只需很少的代碼就可以讓這樣的東西工作。

就個人而言,我會從最簡單的解決方案開始,然后慢慢添加。 嘗試只寫出一個文件並使用您的音頻播放器播放它,這樣您就不必處理音頻 api。 只需使用單個數組即可啟動並就地修改。 絕對從單線程開始。 隨着項目的發展,您可以開始轉向其他解決方案,例如管道而不是陣列、多線程處理或使用音頻 API。

如果您想創建一個可以發布的項目,具體取決於它的具體內容,您可能必須轉向更復雜的庫,例如一些實時音頻處理。 但是,當您達到這一點時,通過上述簡單方法學習的基礎知識肯定會有所幫助。

祝你好運!

我已經做了很多實時 DSP,雖然沒有音頻。 雖然您的任何一個想法(不可變緩沖區)與(已修改的可變緩沖區)都可以工作,但我更喜歡為信號路徑中的每個鏈接創建一個永久緩沖區。 大多數效果不適合就地修改,因為每個輸入樣本都會影響多個 output 樣本。 當您有重采樣階段時,每個鏈接的緩沖區技術特別有效。

在這里,當樣本到達時,第一個緩沖區被覆蓋。 然后第一個過濾器從它的輸入緩沖區(第一個緩沖區)讀取新數據並寫入它的 output(第二個緩沖區)。 然后它調用第二個階段從第二個緩沖區讀取並寫入第三個緩沖區。

這種模式完全消除了動態分配,允許每個階段保留可變數量的歷史(因為效果需要一些內存),並且在重新排列路徑中的過濾器方面非常靈活。

好吧,那我也試試賞金吧:)

我實際上處於非常相似的情況。 我制作電子音樂已經很久了,但只是在過去的幾年里,我才開始探索實際的音頻處理。

你提到你研究過數學。 我認為這很關鍵。 我目前正在努力通過 Ken Steiglitz 的數字信號處理入門 - 應用到數字音頻和計算機音樂。 如果您不知道復數和相量,那將非常困難。

我是 Linux 人,所以我開始在 C 中編寫 LADSPA 插件。 我認為從基本層面開始,真正了解正在發生的事情是很好的。 如果我在 Windows 上,我會從 Steinberg 下載 VST SDK 並編寫一個概念插件的快速證明,它只會增加噪音或其他任何東西。

選擇 VST 或 LADSPA 等框架的另一個好處是,您可以立即在普通音頻套件中使用插件。 將您的第一個自制插件應用於音軌的滿足感是無與倫比的。 另外,您將能夠與其他音樂家分享您的插件。

在 C#/F# 中可能有一些方法可以做到這一點,但如果你打算編寫 VST 插件,我會推薦 C++,以避免任何不必要的開銷。 這似乎是行業標准。

在緩沖方面,我一直在使用循環緩沖區(這里有一篇好文章: http://www.dspguide.com/ch28/2.htm )。 一個很好的練習是實現一個有限響應濾波器(Steiglitz 將其稱為前饋濾波器)——它們依賴於緩沖並且玩起來很有趣。

我有一個關於 Github 的倉庫,里面有一些非常基本的 LADSPA 插件。 除了架構差異之外,它們也可能對編寫 VST 插件的人有用。 https://github.com/andreasjansson/my_ladspa_plugins

另一個很好的示例代碼來源是 CSound 項目。 那里有大量的 DSP 代碼,該軟件主要針對音樂家。

你可以看看BYOND 它是 C# 中用於程序化音頻/midi 樂器和效果創建的環境。 它可以獨立使用,也可以作為 VST 樂器和效果器使用。

完全披露我是 BYOND 的開發者。

從閱讀thisthis開始。

這會讓你知道你必須做什么。

然后,學習 DirectShow 架構 - 並學習如何不這樣做,而是嘗試創建它的簡化版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM