我曾经遇到的问题是,如果我直接映射FFT值,音频信号值变化太快而无法产生令人愉悦的视觉输出:
值以“平滑”结果:
// pseudo-code
delta = fftValue - smoothedFftValue;
smoothedFftValue += delta * 0.2;
// 0.2 is arbitrary - the lower the number, the more "smoothing"
换句话说,我获取当前值并将其与最后一个值进行比较,然后添加该差值到最后一个值的一小部分。结果看起来像这样:
所以我的问题是:
这是一个完善的模式或函数吗哪个术语已经存在?是的,这个术语是什么?我在上面使用了“平滑”功能,但我知道这意味着DSP中的某些操作非常具体,可能不正确。除此之外,它似乎与容量包络有关,但又不完全相同。如果这是一个愚蠢的问题,请您谅解。(在这里阅读其他讨论,我知道我的知识比平均水平低很多。)
#1 楼
您已实现的是一个单极点低通滤波器,有时也称为泄漏积分器。您的信号具有差分方程:$$
y [n] = 0.8 y [n-1] + 0.2 x [n]
$$
其中$ x [n] $是输入(平滑的bin值),$ y [n] $是平滑的bin值。这是实现简单,低复杂度的低通滤波器的常用方法。在之前的答案中,我已经写过好几次了。参见[1] [2] [3]。
评论
$ \ begingroup $
非常感谢。因此,非常有帮助。我自己进行谷歌搜索就像在DSP方面迷路了一样。仅需搜索几个术语就可以掌握一些内容。
$ \ endgroup $
–迈克尔·布罗姆利(Michael Bromley)
16年11月1日在19:45
$ \ begingroup $
我想知道。我认为OP将此滤波器应用于频域中各个bin中的一系列值。正常的低通应用于时域中的一系列采样。效果是否一样(我不这样认为,因为高频部分仍在信号中,但是……它们的强度改变得更慢?)?如果不是,您能否详细说明滤波器对时域信号的实际作用?
$ \ endgroup $
–乔纳斯·谢弗(JonasSchäfer)
16年11月2日在6:30
$ \ begingroup $
@JonasWielicki我认为目标是平滑每个单独的bin值,以使其不会很快变化。低通滤波器(如答案中所述)也适用于任何时间序列,无论其域(时间或频率或其他任何东西)如何。
$ \ endgroup $
– Arpit Jain
16年11月2日在8:43
$ \ begingroup $
@arpitjain我明白这一点。我只是想知道是否有任何了解(不一定由您,操作员或应答者来理解),当您这样做时,它如何影响时域。
$ \ endgroup $
–乔纳斯·谢弗(JonasSchäfer)
16年2月2日在13:20
$ \ begingroup $
@JonasWielicki该操作在频域中是卷积,因此它转换为时域中(相应(逆)傅立叶变换的)乘积。
$ \ endgroup $
– MBaz
16年2月2日在14:01
#2 楼
警告:包括一些历史记录,旧报纸(我喜欢它们)和打孔卡!您使用$ a = 0.2 $的形式:
$$ y(n)= y( n–1)+ a [x(n)– y(n–1)] \ , $$
$$ y(n)= ax(n)+(1 – a)y(n–1)\,。$$
上面的第一个版本不那么自然,但是它避免了一个乘法,并且效率更高。
两个公式都得出线性,因果和无限冲激响应滤波器。故事可以追溯到Poisson,以及通过Poisson,Kolmogorov-Zurbenko自适应滤波器,Brown(库存控制的统计预测。McGraw-Hill,1959年),Holt(1957年)和Winters(1960年)。它被实现为一种递归滤波方案,在整个文献中都以不同的名称而为人所知: />指数平滑,
指数移动平均值(EMA),
指数加权移动平均值(EWMA),
布朗的简单(线性)指数平滑(有时称为SES),
ARIMA(0,1,1)模型。
名称中的“指数”与具有几何级数的脉冲响应有关,该函数对指数衰减进行采样:$ h [n] =(1-a)u [n] a ^ n $。
作为历史记录,Robert G. Brown和Arthur D. Little于1956年在指数平滑中使用此方法来预测需求,显然是在烟草行业。可以在Holt-Winters假人(或开发人员)的冬季预测中找到更多的历史和解释-第一部分。Peter Zehna在1966年的关于指数平滑的一些评论中提供了重要的评论。R. Brown在运筹学大全中的一章和管理科学(Google图书)的历史可以追溯到1944年,此处可读的页面如下:
许多方法扩展了这种平滑处理,而当数据具有趋势或季节性时,这种平滑处理将缺乏有效性。其中一些被称为双重或三次指数平滑和Holt-Winters滤波器。
您还可以检查:“简单过滤器”如何工作?
评论
$ \ begingroup $
谢谢,太好了。如前所述,我对此完全陌生,因此您的一些回答需要进一步的研究,以使我充分理解,但是它肯定回答了我的问题,然后回答了一些问题。如果没有其他更早的答案,这当然也值得接受。
$ \ endgroup $
–迈克尔·布罗姆利(Michael Bromley)
16年11月1日在19:58
$ \ begingroup $
小修正,我认为Winters 1(960)应该是Winters(1960)
$ \ endgroup $
– SGR
16年2月2日在15:36
#3 楼
是否有更好的方法或需要对此解决方案的进一步研究?我应该看一下?
if new_value > current_value
current_value = new_value;
else
current_value = current_value * decay;
这会立即对信号中的任何新信号或峰值或瞬变做出反应,但会持续一段时间,因此产生的混乱画面要少得多。衰减应为0到1之间的常数。它控制以0为瞬时且1为永不停止的小节的完成速度。
评论
$ \ begingroup $
我注意到,这与我在大学期间所做的作业相似,通过对(完全矩形)音符进行卷积(并缩放以匹配峰值和持续时间),改进了声音非常细微的MIDI(在先前的作业中创建)三角形信号的信号急剧上升(尽管不是立即上升),然后逐渐衰减,以产生清晰的音符,“自然”消失。歌曲的声音有了很大的改善(本例中为Fur Elise)。
$ \ endgroup $
– KRyan
16-11-3在4:36
$ \ begingroup $
我想如果new_value大于current_value *衰减,您可能希望保留
$ \ endgroup $
–user276648
17年5月24日在7:39
#4 楼
在美国国防部承包商圈子周围,此特定过滤器通常称为“ alpha过滤器”,因为它可以用一个传统上称为“ alpha”的参数来表征。它与simpe类似RC低通滤波器。
它们非常简单,有严重的局限性,但是相对于更复杂(和更复杂!)的滤波器,它们具有不可否认的优势,如果您避开它们的问题区域,它们完成工作。
#5 楼
如其他答案中所述,这是单极递归滤波器,是一种无限脉冲响应(IIR)滤波器。Steven W. Smith的《数字信号处理科学家和工程师指南》提供了有关此DSP功能和其他DSP功能的大量信息, > ...通过将输入信号中的值乘以“ a”系数,将先前从输出信号中计算出的值乘以“ b”系数,然后将乘积相加,得出输出信号中的每个点。注意,b0没有值,因为它对应于要计算的样本。公式19-1称为递归公式,使用该公式的过滤器称为递归过滤器。定义滤波器的“ a”和“ b”值称为递归系数。
评论
现在,我想知道如果使用平滑的FFT并对其进行逆FFT会得到什么。以不同的顺序做出第一个答案会更直接吗? current_value = current_value *衰减;如果(new_value> current_value){current_value = new_value; }
@immibis根据我的理解,这应该是一个混响。纠正我,如果我错了。
当然,优化的编译器将产生相同的实现。关键是当(current_value * decay)
我真的很喜欢这个问题。这是那些尝试一些事情的人偶然发现自己处于巨大知识树的底部的一种方法(特别是无限脉冲响应过滤器)。同时,已经爬上树的人可以描述他们已经在树枝中发现的所有酷事...