Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从头开始创建DSP系统_C#_.net_Audio_F#_Buffering - Fatal编程技术网

C# 从头开始创建DSP系统

C# 从头开始创建DSP系统,c#,.net,audio,f#,buffering,C#,.net,Audio,F#,Buffering,我喜欢电子音乐,我对它的节奏感兴趣。 我发现了很多关于库中堆栈溢出的有用问题,这些库可以用来播放音频、过滤器等。但我真正好奇的是,究竟是什么在产生幻觉:数据是如何在效果和振荡器之间传递的?我已经对dsp的数学方面进行了研究,我已经找到了问题的答案,但我不确定使用什么样的缓冲系统等。最终目标是建立一个简单的对象,即相互传递数据的效应和振荡器(如果我最终没有拿出所有的头发来实现它,可能会使用多线程)。这不是下一个Problerhead原因,但我感兴趣的是它是如何工作的,这更多的是一个练习,而不是最终

我喜欢电子音乐,我对它的节奏感兴趣。 我发现了很多关于库中堆栈溢出的有用问题,这些库可以用来播放音频、过滤器等。但我真正好奇的是,究竟是什么在产生幻觉:数据是如何在效果和振荡器之间传递的?我已经对dsp的数学方面进行了研究,我已经找到了问题的答案,但我不确定使用什么样的缓冲系统等。最终目标是建立一个简单的对象,即相互传递数据的效应和振荡器(如果我最终没有拿出所有的头发来实现它,可能会使用多线程)。这不是下一个Problerhead原因,但我感兴趣的是它是如何工作的,这更多的是一个练习,而不是最终产品

目前我使用.net和C#,最近我学习了F#(这可能会或可能不会导致一些有趣的数据处理方法),但如果这些不适合这份工作,我可以在必要时学习另一种系统

问题是:通过使用缓冲区的程序获取大量信号数据的最佳方法是什么?例如,使用队列、数组、链表等是否更好?我应该使样本不可变,并在每次对系统应用效果时创建一组新数据,还是只编辑缓冲区中的值?我应该有一个组织传递数据的dispatcher/thread pool样式的对象,还是效果函数应该直接在彼此之间传递数据

谢谢

编辑:另一个相关的问题是,接下来我将如何使用windows API来播放此阵列?我真的不想使用DirectShow,因为Microsoft现在几乎让它死掉了

EDIT2:谢谢你的回答。在看了所有的技术之后,我会选择使用XNA 4(我花了一段时间在互联网上搜索,找到了解释如何使用XNA 4的方法)或者NAudio来输出音乐…还不确定是哪一个,这取决于系统的先进程度。当C#5.0问世时,我将使用它的异步功能在上面创建一个特效架构。我几乎平等地使用了每个人的答案,所以现在我有一个难题,该给谁赏金…

从阅读一篇文章开始d

这会让你知道你必须做什么


然后,学习DirectShow体系结构-并学习如何不这样做,而是尝试创建简化的版本。

您看过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]);
        }
    }
public override void进程(VstAudioBuffer[]在通道中,VstAudioBuffer[]在通道外)
{
VST音频通道=输出通道[0];
用于(int n=0;n
audioChannel是非托管浮点*缓冲区的包装器

您可能将样本存储在一个不可变的数组中。然后,当您想要播放它们时,您可以将数据复制到输出缓冲区(如果需要,可以更改频率)并在该缓冲区中执行效果。注意,您可以使用多个输出缓冲区(或通道)并在最后将它们相加

编辑


我知道播放阵列的两种低级方法:Windows API中的DirectSound和WaveOut…但是,您可能更喜欢使用外部高级库,例如.NAudio便于.NET音频操作-请参见此向声卡发送正弦波。您可以看到,它们还使用浮点数组,这是我推荐的(如果使用字节进行计算,最终会在声音中产生大量锯齿).

关于缓冲和异步/线程/同步问题,我建议您看看新的TPL数据流库。它有块原语、并发数据结构、数据流网络、异步消息处理和TPL基于任务的抽象(可与异步/等待C#5功能一起使用),非常适合这种类型的应用。

F#可能是一个不错的选择,因为它非常适合操作函数。函数可能是信号创建和处理的良好构建块

由于Array模块中的高阶函数,F#通常也擅长处理集合,尤其是数组

这些品质使得F#在金融行业很受欢迎,我想,它对信号处理也很有用

有一节专门介绍傅里叶变换,这可能与你想做的事情有关。不过,我想网上有很多关于傅里叶变换的免费信息


最后,要播放示例,您可以使用。我认为最新版本的API(4.0)也允许录音,但我从未使用过。Xbox上有一个著名的音乐编辑应用程序,名为XNA,所以这绝对是可能的。

我不知道这是否真的是你想要的,但这是我在大学期间的一个个人项目。直到我实现了它,我才真正理解声音和DSP是如何工作的我自己。我试着尽可能接近演讲者,所以我只使用libsndfile来处理复杂的文件格式

基本上,我的第一个项目是创建一个大的double数组,用正弦波填充它,然后使用sf_writef_double()将该数组写入一个文件,以创建我可以播放的内容,并在wav中查看结果