问题标签 [signal-processing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
12558 浏览

audio - Is there an FFT that uses a logarithmic division of frequency?

Wikipedia's Wavelet article contains this text:

The discrete wavelet transform is also less computationally complex, taking O(N) time as compared to O(N log N) for the fast Fourier transform. This computational advantage is not inherent to the transform, but reflects the choice of a logarithmic division of frequency, in contrast to the equally spaced frequency divisions of the FFT.

Does this imply that there's also an FFT-like algorithm that uses a logarithmic division of frequency instead of linear? Is it also O(N)? This would obviously be preferable for a lot of applications.

0 投票
4 回答
15956 浏览

audio - How do you do bicubic (or other non-linear) interpolation of re-sampled audio data?

I'm writing some code that plays back WAV files at different speeds, so that the wave is either slower and lower-pitched, or faster and higher-pitched. I'm currently using simple linear interpolation, like so:

This works fine, but it tends to sound OK only when I lower the frequency of the playback (i.e. slow it down). If I raise the pitch on playback, this method tends to produce high-frequency artifacts, presumably because of the loss of sample information.

I know that bicubic and other interpolation methods resample using more than just the two nearest sample values as in my code example, but I can't find any good code samples (C# preferably) that I could plug in to replace my linear interpolation method here.

Does anyone know of any good examples, or can anyone write a simple bicubic interpolation method? I'll bounty this if I have to. :)

Update: here are a couple of C# implementations of interpolation methods (thanks to Donnie DeBoer for the first one and nosredna for the second):

In these functions, x1 is the sample value ahead of the point you're trying to estimate and x2 is the sample value after your point. x0 is left of x1, and x3 is right of x2. t goes from 0 to 1 and is the distance between the point you're estimating and the x1 point.

The Hermite method seems to work pretty well, and appears to reduce the noise somewhat. More importantly it seems to sound better when the wave is sped up.

0 投票
1 回答
1537 浏览

iphone - 使用 iPhone 的 SIMD 浮点单元将浮点数转换为整数

我目前正在尝试使用 Shark 优化一些与 DSP 相关的代码,发现我在浮点到整数的转换中浪费了很多时间:

由于 iPhone 似乎有一个 ARM11 FP 协处理器,我想知道是否可以用 FTOSI 指令替换我的代码。ARM 网站上提供了一些文档,但我没有内联手动优化程序集的经验。以前有人这样做过吗?
我想我可以内联代码

但是如何检查指令是否可用?
我怎样才能传递我的价值?

EDIT1:正如路易斯已经指出的那样,我忘了提到我正在编译时关闭了“Compile for Thumb”。

EDIT2:因为我想将浮点数转换为有符号的 Int16 而不是无符号的 Int,所以我将 ARM 指令从 FTOUI 更改为 FTOSI。这是原帖中的一个错误。

0 投票
7 回答
4804 浏览

audio - 识别常见的周期性波形(方波、正弦波、锯齿波……)

在没有任何用户交互的情况下,程序如何识别来自 ADC 的记录中存在什么类型的波形?

为了这个问题:恒定频率的三角波、方波、正弦波、半正弦波或锯齿波。电平和频率是任意的,它们会有噪音、少量失真和其他缺陷。

各种波形

我也会提出一些(天真的)想法,你可以投票赞成或反对。

0 投票
3 回答
261 浏览

audio - 使用严重受限的解释语言

我正在使用一种称为 JS 的嵌入式语言进行编码。

我希望能够以任何顺序调用三个函数。(ABC、ACB、BAC、BCA、CBA、CAB。)

诀窍?该语言没有用户定义的函数。

它确实有条件和循环结构。

我想我有三个选择。

  1. 复制一大堆代码。
  2. 编写一个预处理器(这将创建所有重复的代码)。
  3. 执行一个包含三个迭代的循环,使用一个数组来控制每次循环调用哪个功能。

我讨厌#1。重复的代码很讨厌。如何在不搞砸的情况下改变任何东西?

我猜#2没问题。至少我在源代码中没有重复的代码。但是我的输出代码是我要调试的,我想知道我是否想偏离它。从好的方面来说,我可以在语言中添加一堆糖。

我认为我最好的选择是#3。

还有其他想法吗?没有转到。没有功能。没有现有的预处理器。

#3 的有趣之处在于它本质上是臭名昭著的 for/switch 噩梦。

0 投票
6 回答
3330 浏览

algorithm - 确定两个不同频率信号之间有效“相位差”的算法?

快速版本:

如果我拥有的唯一信息是每个上升沿发生的时间,我可以使用什么算法来确定两个不同频率的方波信号之间的“相位差” ?

详细版本:

我正在从事一个嵌入式软件项目,并且遇到了一个有趣的问题。我正在从两个霍尔效应速度传感器收集数据,每个传感器都针对两个啮合齿轮之一,如下图所示:

啮合齿轮和脉冲信号

注意:
正如Jaime所指出的,该图中的信号实际上具有相同的频率。真正的硬件在两个目标齿轮之间还有几个齿轮级,其中一些是通过轴而不是啮合齿连接的,所以我最终得到了两个频率不同的方波,它们之间的比率仍然是一个常数。我想简化图表以了解问题的实质,但看起来我简化得太多了!
/笔记

速度传感器输出一个方波信号,其频率与每个齿轮的转速成正比。当单个齿轮齿的前沿(和后沿)经过传感器时,会出现方波的上升(和下降)沿。

我知道每个齿轮上有多少齿,并且基于这些信息,我能够根据方波信号的频率准确测量每个齿轮的转速。

为了测量频率,我将每个速度传感器信号连接到嵌入式控制器上的高速捕捉定时器引脚。捕捉定时器自动检测方波信号的上升沿,将表示发生转换的时间的值加载到寄存器中,并触发中断。每个信号的捕获点在图中以黄色表示。中断服务程序如下所示:

我想做的事:

我希望能够检测到这两个方波信号的相对时序的微小差异。由于没有更好的术语,我将其称为“相位差”。如果两个信号具有完全相同的频率,这将很简单,并且相位差将是正确使用的术语。

这就是我的意思:如果我要长时间记录这两个信号,然后人为地将高速(蓝色)信号减慢(或“拉伸”)16/9倍,它将具有与较低速度(红色)信号完全相同的频率,并且两个信号将具有一些可测量的相位差,即红色信号中断和蓝色信号中断之间的时间差。我想计算这个相同的时间差(或等效的东西),而不必长时间记录信号。嵌入式控制器上的资源有限,因此存储大量过去的转换时间不是一种选择。

有没有人遇到过这个?实际项目有几个这样的齿轮和传感器布置,所以我正在寻找一种可以重用的优雅算法。提前致谢!

0 投票
3 回答
5019 浏览

algorithm - 语音变换算法

有人可以指出我的语音改变算法吗?最好用Java或C?我可以用它来将录制的人声流变成听起来像擎天柱的东西。(仅供参考-擎天柱是变形金刚中的主要汽车人,声音非常独特……不是每个人都知道。)有开源解决方案吗?

0 投票
6 回答
9007 浏览

signal-processing - 正弦表插值

我想组装一个 SDR 系统,该系统最初调谐 AM,后来调谐 FM 等。我计划用来执行此操作的系统将有一个用于直接数字合成 (DDS) 的正弦查找表。为了正确调谐,我希望能够精确控制馈送到混频器(在这种情况下为乘数)的正弦波的频率。我希望线性插值会很接近,但认为非线性方法会提供更好的结果。

什么是用于正弦表的良好且快速的插值方法。目标系统上的乘法和加法很便宜;分裂代价高昂。

编辑:我计划用乘法/移位函数实现常量,以将常量标准化为缩放整数。中间值将使用宽加,乘法将使用 18 或 17 位。可以使用浮点“预计算”,但不能在目标平台上使用。当我说“除法代价高昂”时,我的意思是它必须使用乘数和大量代码来实现。这不是不可想象的,但应该避免。然而,真正的浮点 IEEE 方法将在该平台上占用大量资源,以及自定义实现。

任何 SDR 经验都会有所帮助。

0 投票
1 回答
517 浏览

audio - 整数调频解调

有哪些适合 FM 解调的软件(或 FPGA)技术?我一直在 MATLAB 中进行试验以尝试获得正确的算法,但我一直将它基于模拟参考材料,结果有限。我可以辨认出音频,但是我无法通过过滤来修复可怕的失真。最终我希望能够在 FPGA 上使用整数实现,但我需要先让基本的解调工作。

FFT 显示频谱已被移回以 DC 为中心,但听起来并不正确。

0 投票
4 回答
5278 浏览

audio - 8 位音频样本到 16 位

这是我的“周末”爱好问题。

我从经典合成器的 ROM 中获得了一些深受喜爱的单周期波形。

这些是 8 位样本(256 个可能的值)。

因为它们只有 8 位,所以本底噪声非常高。这是由于量化误差。量化误差非常奇怪。它使所有频率有点混乱。

我想利用这些周期并制作它们的“干净” 16 位版本。(是的,我知道人们喜欢脏版本,所以我会让用户在脏和干净之间插入他们喜欢的任何程度。)

这听起来不可能,对吧,因为我已经永远失去了低 8 位,对吧?但这在我脑海里已经有一段时间了,我很确定我能做到。

请记住,这些是单周期波形,会一遍又一遍地重复播放,所以这是一种特殊情况。(当然,合成器会做各种各样的事情来让声音变得有趣,包括包络、调制、滤波器交叉淡入淡出等)

对于每个单独的字节样本,我真正知道的是它是 16 位版本中的 256 个值之一。(想象一下相反的过程,其中 16 位值被截断或舍入为 8 位。)

我的评估功能是试图获得最小的本底噪声。我应该能够通过一个或多个 FFT 来判断这一点。

详尽的测试可能需要很长时间,所以我可以先通过较低分辨率的测试。还是我只是随机推送随机选择的值(在保持相同 8 位版本的已知值内)并进行评估并保持更清晰的版本?或者有什么更快的我可以做的吗?当搜索空间的其他地方可能有更好的最小值时,我是否有陷入局部最小值的危险?我在其他类似的情况下也遇到过这种情况。

有没有我可以做出的初步猜测,也许是通过查看相邻值?


编辑:有几个人指出,如果我取消新波形采样到原始波形的要求,问题会更容易。确实如此。事实上,如果我只是在寻找更干净的声音,那么解决方案是微不足道的。