主要内容

自适应线增强器

这个例子展示了如何使用一种称为自适应线增强器(ALE)的结构来应用自适应滤波器进行信号分离。在自适应线增强中,一个被测信号x(n)包含两个信号,一个是感兴趣的未知信号v(n),一个是近周期噪声信号eta(n)。

其目的是去除被测信号中的噪声信号,从而获得感兴趣的信号。

作者:Scott C. Douglas

加载感兴趣的信号

我们先放一个感兴趣的信号,一段韩德尔的哈利路亚副歌。

audioReader = dsp。AudioFileReader (“handel.ogg”“SamplesPerFrame”, 44100);timeScope = timeScope (“SampleRate”, audioReader。SampleRate,...“YLimits”[1],“TimeSpanSource”“属性”“时间间隔”1);~isDone(audioReader) x = audioReader() / 2;timeScope (x);结束

听声音片段

您可以使用音频设备写入器收听感兴趣的信号。

释放(audioReader);audioWriter = audioDeviceWriter;~isDone(audioReader) x = audioReader() / 2;audioWriter (x);结束

产生噪声信号

现在我们做一个周期噪声信号——频率为1000hz的正弦信号。

正弦= dsp。SineWave (“振幅”, 0.5,“频率”, 1000,...“SampleRate”, audioReader。SampleRate,...“SamplesPerFrame”, audioReader.SamplesPerFrame);

现在我们画出10毫秒的正弦曲线。它在10毫秒内显示10个周期,正如它应该的那样。

η= sin ();Fs = sine.SampleRate;阴谋(1 / Fs: 1 / Fs: 0.01,埃塔(1:地板(0.01 * Fs)));包含(的时间(秒));ylabel (“振幅”);标题(“噪声信号,埃塔(n)”);

听噪音

周期噪声是纯音。下面的代码播放一秒钟(一帧44100个样本)的噪声信号。

η= sin ();释放(audioWriter);audioWriter (eta);

被测信号

我们实际测量的信号是这两个信号的和,我们称这个信号为s(n)s(n)图表明,音乐信号的包络线很大程度上被遮蔽了。听一段3秒的测量信号,噪音很明显…

释放(audioReader);释放(timeScope);释放(audioWriter);数= 1;count < 4 s = (audioReader() / 2) + sin(); / /接收audioReadertimeScope(年代);audioWriter(年代);Count = Count + 1;结束

自适应滤波器的配置

自适应直线增强器(ALE)是基于线性预测的直接概念。近周期信号可以使用过去样本的线性组合来完美预测,而非周期信号则不能。因此,将被测信号s(n- d)的延时版本作为自适应滤波器的参考输入信号x(n),使期望响应信号d(n)等于s(n)。在这种系统中选择的参数是信号延迟D和用于自适应线性估计的滤波器长度L。延迟的量取决于感兴趣的信号的相关量。因为我们没有这个信号(如果我们有,我们就不需要ALE了!),我们只需选择一个值D=100,然后更改它。这样的选择表明,如果哈利路亚合唱团的样本之间的间隔超过12毫秒,那么它们是不相关的。此外,我们将为自适应滤波器选择L=32的值,尽管这也可以更改。

D = 100;延迟= dsp.Delay (D);

最后,我们将使用一些块自适应算法,要求x(n)和d(n)的向量长度为块长度的整数倍。我们将选择一个长度为N=49的块作为开始。

块LMS

我们要探讨的第一个算法是Block LMS算法。该算法与众所周知的最小均方(LMS)算法相似,不同的是它使用块系数更新而不是逐样本系数更新。Block LMS算法需要一个滤波器长度,一个块长度N,一个步长值mu。怎么选呢?让我们从mu = 0.0001的值开始,并很快对其进行优化。

L = 32;N = 49;μ= 0.0001;blockLMSFilter =...dsp。BlockLMSFilter (“长度”L,“StepSize”亩,“BlockSize”N);

运行过滤器

输出信号y(n)应该主要包含周期正弦信号,而误差信号e(n)应该包含音乐信息,如果我们都做对了的话。由于我们有原始音乐信号v(n),我们可以将e(n) vs. v(n)与剩余信号e(n)-v(n)绘制在上面所示的图上。看起来系统在经过5秒的步长调整后收敛了。然而,真正的证据是通过倾听获得的;

释放(audioReader);释放(timeScope);释放(audioWriter);~isDone(audioReader) x = audioReader() / 2;S = x + sin ();d =延迟(s);[y, e] = blockLMSFilter (s、d);timeScope (e);audioWriter (e);结束

注意正弦噪声是如何慢慢衰减的。这种行为是由于滤波器系数向其最优值的自适应。

FM噪声来源

现在,从正弦波加音乐信号中去除一个纯正弦波并不是特别具有挑战性,如果干扰正弦波的频率已知的话。一个简单的二极二零陷波器就可以完成这个任务。所以,让我们通过添加fm调制的正弦信号作为噪声源来让这个问题变得更困难一些。

η= 0.5 * sin(2 *π* 1000 / Fs * (0:396899) + 10 * sin(2 *π/ Fs * (0:396899) '));signalSource = dsp。SignalSource(η,...“SamplesPerFrame”, audioReader。SamplesPerFrame,...“SignalEndAction”循环重复的);释放(audioReader);释放(timeScope);释放(audioWriter);~isDone(audioReader) x = audioReader() / 2;s = x + signalSource();timeScope(年代);audioWriter(年代);结束

信号中的“颤音”清晰可闻。固定系数的陷波滤波器不能去除fm调制的正弦波。让我们看看基于块lms的ALE是否可以。我们将步长值增加到mu=0.005,以帮助ALE跟踪噪声信号的变化。

μ= 0.005;释放(blockLMSFilter);blockLMSFilter。StepSize =μ;

运行自适应过滤器

用自适应滤波器对带噪声的音乐信号进行滤波,并与无噪声的音乐信号进行误差比较。

释放(audioReader);释放(timeScope);释放(audioWriter);~isDone(audioReader) x = audioReader() / 2;s = x + signalSource();d =延迟(s);[y, e] = blockLMSFilter (s、d);timeScope ([x, e]);audioWriter (e);结束

释放(audioReader);释放(timeScope);释放(audioWriter);