这种简单的信号平滑方法是否有技术术语?


26

首先,我是DSP的新手,没有任何实际知识,但是我正在开发一个音频可视化程序,并且像典型的频谱可视化一样,我将FFT数组表示为竖线。

我的问题是,如果我直接映射FFT值,音频信号值变化太快而无法产生令人愉悦的视觉输出:

在此处输入图片说明

因此,我对这些值应用了一个简单的函数,以便“平滑”结果:

// pseudo-code
delta = fftValue - smoothedFftValue;
smoothedFftValue += delta * 0.2; 
// 0.2 is arbitrary - the lower the number, the more "smoothing"

换句话说,我正在获取当前值并将其与最后一个值进行比较,然后将该增量的一部分添加到最后一个值。结果看起来像这样:

在此处输入图片说明

所以我的问题是:

  1. 这是一个已经存在的完善的模式或功能吗?是的,这是什么意思?我在上面使用了“平滑”功能,但是我知道这意味着DSP中的某些功能非常具体,可能不正确。除此之外,它似乎与容量包络有关,但也不完全相同。

  2. 我是否应该寻找更好的方法或进一步研究解决方案?

感谢您的时间和歉意,如果这是一个愚蠢的问题(在这里阅读其他讨论,我知道我的知识比平均水平低很多)。


1
现在,我想知道如果采用平滑的FFT并对其进行逆FFT,会得到什么。
user253751 '16

以不同的顺序做出第一个答案会更直接吗?current_value = current_value *衰减;如果(new_value> current_value){current_value = new_value; }
理查德·福斯特

@immibis根据我的理解,这应该是一个混响。如果我错了纠正我。
Andreas

当然,优化的编译器将产生相同的实现。当(current_value * decay)<new_value <current_value时,关键是要获得正确的结果。
理查德·福斯特

2
我真的很喜欢这个问题。这是那些尝试一些事情的人偶然发现自己处于巨大知识树的底部的一种方法(特别是无限冲激响应过滤器)。同时,已经爬上树的人可以描述他们已经在树枝中发现的所有酷事……
DrMcCleod

Answers:


37

您已实现的是一个单极点低通滤波器,有时也称为泄漏积分器。您的信号具有差分方程:

y[n]=0.8y[n1]+0.2x[n]

其中是输入(未平滑的bin值),是平滑的bin值。这是实现简单,低复杂度的低通滤波器的常用方法。在以前的答案中,我已经写过好几次了。参见[1] [2] [3]y [ n ]x[n]y[n]


4
非常感谢。因此,非常有帮助。我自己进行谷歌搜索就像在DSP方面迷失在海上一样。仅需搜索几个术语就可以掌握一些内容。
Michael Bromley

3
我想知道。我认为OP将此滤波器应用于频域中各个bin中的一系列值。在时域中将正常的低通应用于一系列采样。效果是否相同(我不这么认为,因为高频部分仍在信号中,但是……它们的强度变化更慢?)?如果不是,您能否详细说明滤波器对时域信号的实际作用?
JonasSchäfer'16

3
@JonasWielicki我认为目标是平滑每个单独的bin值,以使其不会很快变化。低通滤波器(如答案中所述)也适用于任何时间序列,无论其域(时间或频率或其他任何东西)如何。
Arpit Jain

@arpitjain我明白这一点。我只是想知道是否有任何了解(不一定是您,OP或应答者的理解),当您这样做时,它如何影响时域。
JonasSchäfer'16

@JonasWielicki该操作在频域中是卷积,因此它转换为时域中(相应(逆)傅立叶变换的)乘积。
MBaz

17

警告:包括一些历史记录,旧报纸(我喜欢它们)和打孔卡!

您使用的形式: 有时写为: a=0.2

y(n)=y(n1)+a[x(n)y(n1)],
y(n)=ax(n)+(1a)y(n1).

上面的第一个版本不那么自然,但它避免了一个乘法,并且效率更高。这两个公式都产生线性因果无限脉冲响应滤波器。故事可追溯至Poisson和Kolmogorov-Zurbenko自适应滤波器,并通过Brown(存货控制的统计预测。McGraw -Hill,1959年),Holt(1957年)和Winters(1960年)进行回顾。它被实现为递归过滤方案,在整个文献中都使用不同的名称来表示:

  • 一阶指数平均低通滤波器,
  • 指数平均器
  • 指数平滑法
  • 指数移动平均线(EMA),
  • 指数加权移动平均线(EWMA),
  • 布朗的简单(线性)指数平滑(有时称为SES),
  • ARIMA(0,1,1)模型。

名称中的“指数”与具有几何级数的脉冲响应有关,该响应对指数衰减进行采样:。h[n]=(1a)u[n]an

作为历史记录,Robert G. Brown和Arthur D. Little于1956年在指数平滑中使用此方法来预测需求,显然是在烟草行业。有关傻瓜(或开发人员)的Holt-Winters预测-第一部分,可以找到更多历史和解释。彼得·泽纳(Peter Zehna)在1966年的《关于指数平滑的某些评论》中进行了严格的评论。运筹学与管理科学百科全书(Google书籍)中的R. Brown 撰写的一章的历史可以追溯到1944年,可读页面在此处转载:

指数平滑,p。 205,运筹学与管理科学百科全书

指数平滑,p。 206,运筹学与管理科学百科全书

许多方法扩展了这种平滑处理,而当数据具有趋势或季节性时,这种平滑处理将缺乏有效性。其中一些被称为双重或三次指数平滑和Holt-Winters滤波器

您还可以检查:“简单过滤器”如何工作?


1
谢谢,太好了。如前所述,我对此完全陌生,因此您的一些答案需要进一步研究,以使我充分理解,但是它肯定会回答我的问题,然后再回答一些问题。如果不为别的,刚才的答复,这当然是值得接受作为也回答。
Michael Bromley

1
小幅修正,我认为Winters 1(960)应该是Winters(1960)
SGR 2016年

9

我是否应该寻找更好的方法或进一步研究解决方案?

音频表的常规方法是“有损峰值检测器”。

if new_value > current_value
  current_value = new_value;
else
 current_value = current_value * decay;  

这会立即对信号中的任何新信号,峰值信号或瞬变信号做出反应,但会持续一段时间,因此产生的画面要少得多。衰减应为0到1之间的一个常数。它控制条形完成的速度,以0为瞬时,以1为永不。


我注意到,这与我在大学期间所做的作业相似,通过将(完全矩形的)音符信号与三角形进行卷积(并缩放以匹配峰值和持续时间),改进了非常细微的MIDI(在先前的作业中创建)信号急剧上升(虽然不是立即),然后逐渐衰减,以产生清晰的音调,“自然”消失。这首歌的音色得到了极大的改善(本例中为Fur Elise)。
KRyan

我猜你想保留new_value它是否大于current_value * decay
user276648

6

在美国国防部承包商圈子周围,此特定过滤器通常称为“ alpha过滤器”,因为它可以用一个传统上称为“ alpha”的参数来表征。

它直接类似于simpe模拟RC低通滤波器。

它们非常简单,具有严重的局限性,但是与更复杂(和更复杂!)的过滤器相比,它们具有不可否认的优势,如果您避开它们的问题区域,它们就可以完成工作。


3

如其他答案所述,这是单极递归滤波器,是一种无限冲激响应(IIR)滤波器。

史蒂文·史密斯(Steven W.Smith)的《数字信号处理科学家和工程师指南》提供了有关此DSP功能和其他DSP功能的大量信息,其中包括: 无限冲激响应(IIR)

...通过将输入信号中的值乘以“ a”系数,将先前从输出信号中计算出的值乘以“ b”系数,然后将乘积相加,可以找到输出信号中的每个点。 b0没有值,因为它对应于要计算的样本。公式19-1称为递归公式,使用该公式的过滤器称为递归过滤器。定义滤波器的“ a”和“ b”值称为递归系数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.