Tag: 过滤

C中的Windows虚拟麦克风

我刚才问了一个类似的问题,但我不太了解,所以我不够具体。 我想编写一个程序,从我的麦克风接收输入,处理它,然后将输出发送到假的“虚拟麦克风”,好像我创建的处理过的声音是麦克风听到的。 然后,我希望能够将此虚拟麦克风与任何支持选择麦克风输入(几乎任何编写良好的软件)的应用程序一起用作有效麦克风。 那么应用程序“听到”将是我处理的麦克风输入版本。 我正在使用C语言中的Portaudio,我可以从麦克风中捕获,处理并发送到扬声器就好了。 现在我需要用虚假麦克风替换应用程序中的真实扬声器。 Windows似乎有一些API。 http://msdn.microsoft.com/en-us/library/windows/hardware/ff536201%28v=vs.85%29.aspx所以我的接收器引脚将是真正的麦克风,我将不得不创建一个新的源引脚应该对其他应用程序可见。 我该怎么做呢? 我很难找到代码示例或者甚至是任何非常有用的文档。 语言:C OS:Windows 7

C语言库中的数据流

如何在C中执行数据流(管道和filter,流处理,基于流)? 而不是使用UNIX管道。 我最近遇到了stream.py 。 流是具有流水线机制的迭代,以实现数据流编程和简单的并行化。 我们的想法是获取一个函数的输出,该函数将一个iterable转换为另一个iterable并将其作为另一个这样的函数的输入插入。 虽然您已经可以使用函数组合执行此操作,但此包通过重载>>运算符为其提供了优雅的表示法。 我想在C中复制这种function的简单版本。我特别喜欢>> operator的重载以避免函数组合乱。 维基百科在1990年的一篇Usenetpost中指出了这一暗示 。 为何选择C? 因为我希望能够在微控制器和其他高级语言(Max,Pd *,Python)的C扩展中实现这一点。 *(具有讽刺意味的是Max和Pd是用C编写的,特别是为了这个目的 – 我正在寻找一些准系统)

C中的定点FIR滤波器?

有一种FIR滤波器的算法,但它的浮点: C编程中的FIR滤波器实现 如果我想要一个具有此规范的定点算法,我该怎么做? FIR滤波器通过标准输入和输出接收和发送Q7格式的8位定点数。 请记住以hex格式输出测量时间(滴答数)。 按照上一节中介绍的指导原则,您的程序应该调用getchar()来读取Q7值。 应该调用putchar()来写一个Q7值。 系数是 c0 = 0.0299c1 = 0.4701c2 = 0.4701c3 = 0.299 对于定点算法,我需要为固定点数实现自己的乘法,对吗? 我应该存储像结构一样的fixepdpoint数字 struct point { int integer; int fraction; }; 我应该使用轮class来实现编号,具体如何? 这个数字是32位,所以我可以写下面的变化吗? #define SHIFT_AMOUNT 16 // 2^16 = 65536 #define SHIFT_MASK ((1 << SHIFT_AMOUNT) – 1) 所以我认为我必须实现一个乘法算法,然后是FIR算法本身? 那是对的吗? 你能帮助我吗? 更新 我编译并运行了类似于anser的程序,但它给了我意想不到的输出。 #include #include “system.h” #define FBITS 16 /* […]

具有SSE4.1内在函数的双线性滤波器

我试图找出一个合理快速的双线性过滤函数,一次只为一个过滤的样本,现在作为习惯使用内在函数的练习 – 直到SSE41是好的。 到目前为止,我有以下内容: inline __m128i DivideBy255_8xUint16(const __m128i value) { // Blinn 16bit divide by 255 trick but across 8 packed 16bit values const __m128i plus128 = _mm_add_epi16(value, _mm_set1_epi16(128)); const __m128i plus128ThenDivideBy256 = _mm_srli_epi16(plus128, 8); // TODO: Should this be an arithmetic or logical shift or does it matter? const __m128i partial = _mm_add_epi16(plus128, plus128ThenDivideBy256); […]

包装器printf函数根据用户首选项进行过滤

我的程序写入日志和stdout。 但是,每条消息都有一定的优先级,用户在Preferences中指定哪个优先级转到哪个流(log或stdout)。 unsigned short PRIO_HIGH = 0x0001; unsigned short PRIO_NORMAL = 0x0002; unsigned short PRIO_LOW = 0x0003; 首选项由一些标志处理: unsigned short PRIO_LOG = (PRIO_HIGH | PRIO_NORMAL); unsigned short PRIO_STD = (PRIO_HIGH); write_log函数应该使用与printf函数相同的参数,并添加unsigned short priority参数。 write_log((PRIO_NORMAL|PRIO_LOW), “HELLO %s, take %d”, “World”, 1); (即使PRIO_NORMAL|PRIO_LOW没有意义……) 检查标志很简单: if(priority & PRIO_LOG) (如果在两个参数中都设置了任何标志,则返回> 1) 但是,我不知道如何将字符串文字和格式参数传递给printf函数。 任何人都可以帮助或给我一个指针(可能的替代方法可以实现相同的效果)? 非常感谢。

在C中实现简单的高通和低通滤波器

尝试使用portaudio记录一些数据,然后使用算法filter更改录制的语音,然后播放。 我已经validation了很多(来自示例),但我对C很新,我认为在我的filter实现中我做了一些愚蠢的事情。 #if LOW_PASS { float RC = 1.0/(CUTOFF*2*3.14); float dt = 1.0/SAMPLE_RATE; float alpha = dt/(RC+dt); float filteredArray[numSamples]; filteredArray[0] = data.recordedSamples[0]; for(i=1; i<numSamples; i++){ filteredArray[i] = filteredArray[i-1] + (alpha*(data.recordedSamples[i] – filteredArray[i-1])); } data.recordedSamples = filteredArray; } #endif #if HIGH_PASS { float RC = 1.0/(CUTOFF*2*3.14); float dt = 1.0/SAMPLE_RATE; float alpha = RC/(RC + dt); […]