主要内容

自适应线路增强器

本例展示了如何使用一种称为自适应线路增强器(ALE)的结构将自适应滤波器应用于信号分离。在自适应线路增强技术中,一种测量信号x(n)包含两个信号,一个感兴趣的未知信号v(n),和一个近周期噪声信号埃塔(n)。

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

加载感兴趣的信号

首先播放一个感兴趣的信号,一段韩德尔的哈利路亚合唱片段。

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

听录音片段

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

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

产生噪音信号

现在,生成一个周期噪声信号,一个频率为1000hz的正弦波。

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

绘制这个正弦信号的10毫秒。正如预期的那样,该图在10毫秒内显示了10个周期。

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

图中包含一个轴对象。标题为Noise Signal, eta(n)的axis对象包含一个类型为line的对象。

倾听噪音

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

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

被测信号

我们实际测量的信号是这两个信号的和,我们称之为信号年代(n).年代(n)表示音乐信号的包络在很大程度上被遮蔽。从测量信号中听一段3秒的片段,噪声明显突出。

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

自适应滤波器配置

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

D = 100;delay = dsp.Delay(D);

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

块LMS

我们将探讨的第一个算法是块LMS算法。该算法类似于众所周知的最小均方(LMS)算法,除了它采用块系数更新而不是逐个样本的系数更新。Block LMS算法需要一个过滤器长度,一个块长度N,和步长值μ.让我们从一个值开始μ= 0.0001,并尽快完善它。

L = 32;N = 49;Mu = 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调制的正弦信号作为噪声源来使问题变得更难一些。

η= 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调制的正弦信号。让我们看看Block LMS-based ALE是否可以。我们将步长值增加到μ=0.005,以帮助ALE追踪噪音信号的变化。

Mu = 0.005;释放(blockLMSFilter);blockLMSFilter。步长= mu;

运行自适应过滤器

我们现在用自适应滤波器对有噪声的音乐信号进行滤波,并将误差与无噪声的音乐信号进行比较。

释放(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);