音频信号的多级采样率转换

这个例子演示了如何使用多级/多速率方法来实现不同音频采样速率之间的采样速率转换。

本例使用dsp.SampleRateConverter。该组件自动确定要使用多少个阶段,并设计每个阶段所需的过滤器,以便以计算效率的方式执行采样率转换。

这个例子着重于将以96千赫(DVD质量)采样的音频信号转换成以44.1千赫(CD质量)采样的音频信号。比较是使用数据采样在96千赫可在线http://src.infinitewave.ca/。在本例中,96 kHz的啁啾信号是在本地生成的,因此不需要下载。

设置

定义一些将在整个示例中使用的参数。

frameSize = 64;正= 96年e3;

读取96 kHz文件

上面的网站有3套不同质量的文件,以便进行比较。在这个例子的重点将是一个文件只有:Swept_int.wav。这个文件包含一个在8秒内从0 Hz扫到48 kHz的啁啾正弦波。该文件的格式是32位整数,提供了一个非常高的动态范围。

在这里,您创建了一个系统对象来读取音频文件并确定文件的音频采样率。如果你想用wav文件代替dsp.Chirp,取消对下面的行注释并跳过对的调用dsp.Chirp

= dsp.AudioFileReader (“Swept_int来源。wav”,…SamplesPerFrame, frameSize,……“OutputDataType”、“双”);

产生96千赫的信号

而不是下载Swept_int.wav文件中,也可以生成啁啾信号使用dsp.Chirp如下:

源= dsp.Chirp (“InitialFrequency”0,“TargetFrequency”48岁的e3,“SweepTime”8“TargetTime”8“SampleRate”正,“SamplesPerFrame”frameSize,“类型”,“二次”);

创建频谱分析仪

创建两个频谱分析仪。这些将用于可视化原始信号的频率内容以及转换到44.1 kHz的信号的频率内容。

SpectrumAnalyzer44p1 = dsp.SpectrumAnalyzer (“SampleRate”,44100,“ViewType”,光谱和光谱图,“TimeSpanSource”,“属性”,“时间间隔”8“窗口”,“皇帝”,“SidelobeAttenuation”,220,“YLimits”(-250年,50),“ColorLimits”(-150年,20),“PlotAsTwoSidedSpectrum”、假);SpectrumAnalyzer96 = dsp.SpectrumAnalyzer (“SampleRate”,96000,“ViewType”,光谱和光谱图,“TimeSpanSource”,“属性”,“时间间隔”8“窗口”,“皇帝”,“SidelobeAttenuation”,220,“YLimits”(-250年,50),“ColorLimits”(-150年,20),“PlotAsTwoSidedSpectrum”、假);

原始信号的频谱在96千赫采样

下面的回路绘制了原始96 kHz信号的谱图和功率谱。啁啾信号从0开始,在8秒的模拟时间内扫过48千赫。

NFrames = 8 *正/ frameSize;k = 1:NFrames sig96 = source();%的来源SpectrumAnalyzer96 (sig96);%光谱图结束发布(源)发布(SpectrumAnalyzer96)

设置采样率转换器

为了转换信号,dsp.SampleRateConverter使用。第一次尝试将感兴趣的带宽设置为40 kHz,即覆盖范围[-20 kHz, 20 kHz]。这是人类可以听到的通常被接受的范围。用于去除光谱副本和别名副本的过滤器的阻带衰减保留为默认值80 dB。

BW40 = 40 e3;OutFs = 44.1 e3;SRC40kHz80dB = dsp.SampleRateConverter (“带宽”BW40,“InputSampleRate”正,“OutputSampleRate”,OutFs);

分析转换中涉及的过滤器

使用信息以获取有关用于执行转换的筛选器的信息。这表明转换将分两个步骤执行。第一步涉及两个滤波器的抽取,将信号从96 kHz转换为48 kHz。第二步涉及一个FIR速率转换器,它的内插是147,抽取是160。这导致所需的44.1 kHz。的freqz指令可用于可视化所涉及的两个阶段的组合频率响应。放大显示通带按规定扩展到20 kHz,通带波纹在毫分贝范围内(小于0.003 dB)。

info(SRC40kHz80dB) [H80dB,f] = freqz(SRC40kHz80dB,0:10:25e3);情节(20 * log10 (abs (H80dB) /规范(H80dB正)))包含(的频率(赫兹))ylabel (“(dB)级”)轴([0 25e3 -140 5])
ans = '整体内插因子:147整体抽取因子:320个滤波器:每个输入样本2次乘法:42.334375个系数:8618个滤波器:滤波器1:dsp。FIRDecimator -抽取因子:2滤波器2:dsp。FIRRateConverter -插值因子:147 -抽取因子:160 '

异步缓冲

从96 kHz到44.1 kHz的采样率转换为每320个输入样本产生147个样本。因为啁啾信号是由64个采样的帧组成的,所以需要一个异步缓冲区。啁啾信号一次写入64个样本,每当有足够的样本缓冲时,就读取320个样本并将其输入到样本速率转换器。

浅黄色= dsp.AsyncBuffer;

主要处理循环

下面的循环以流方式执行采样率转换。如果需要的话,计算速度可以实时进行。

绘制了转换信号的谱图和功率谱。光谱图中多余的线条对应于过滤后的光谱别名/图像。从功率谱图上可以看出,这些副本的衰减幅度大于80 dB。

srcFrameSize = 320;k = 1:NFrames sig96 = source();%产生啁啾写(浅黄色,sig96);%缓冲数据如果迷。>= srcFrameSize sig96buffered = read(buff,srcFrameSize);sig44p1 = SRC40kHz80dB (sig96buffered);%转换采样率SpectrumAnalyzer44p1 (sig44p1);转换后的信号的频谱结束结束释放(源)发布(SpectrumAnalyzer44p1)发布(浅黄色)

一个更精确的采样率转换器

为了提高采样率转换器的质量,可以做两个改变。首先,带宽可以从40khz扩展到43.5 kHz。这反过来又要求过滤器具有更清晰的转换。其次,阻带衰减可以从80分贝提高到160分贝。这两种变化都是以牺牲更多的过滤系数以及每个输入样本更多的乘法为代价的。

BW43p5 = 43.5 e3;SRC43p5kHz160dB = dsp.SampleRateConverter (“带宽”BW43p5,“InputSampleRate”正,“OutputSampleRate”OutFs,“StopbandAttenuation”,160);

分析转换中涉及的过滤器

之前的采样率转换器涉及到8618个滤波系数和每个输入采样42.3次乘法的计算成本。通过增加带宽和阻带衰减,成本大幅增加到123896滤波器系数和每个输入样本的440.34次乘法。频率响应显示了更尖锐的滤波器过渡以及更大的阻带衰减。此外,通带纹波现在是在微分贝的规模。注意:这个实现涉及到很长的过滤器的设计,需要几分钟才能完成。然而,这是离线时发生的一次性成本(在实际的采样率转换之前)。

info(SRC43p5kHz160dB) [H160dB,f] = freqz(SRC43p5kHz160dB,0:10:25e3);情节(20 * log10 (abs (H160dB) /规范(H160dB正)));包含(的频率(赫兹))ylabel (“(dB)级”)轴([0 25e3 -250 5])
ans = '总插值因子:147总抽取因子:320个滤波器:每个输入样本2次乘法:440.340625个系数:123896个滤波器:滤波器1:dsp。FIRDecimator -抽取因子:2滤波器2:dsp。FIRRateConverter -插值因子:147 -抽取因子:160 '

主要处理循环

该处理是重复与更精确的采样率转换器。

再一次,转换信号的谱图和功率谱被绘制出来。请注意,成像/混叠衰减得足够弱,以至于在光谱图中不可见。功率谱显示衰减超过160db的谱别名(峰值约为20db)。

k = 1:NFrames sig96 = source();%产生啁啾在=写(浅黄色,sig96);%缓冲数据如果迷。>= srcFrameSize [sig96buffered,under] = read(buff,srcFrameSize);sig44p1 = SRC43p5kHz160dB (sig96buffered);%转换采样率SpectrumAnalyzer44p1 (sig44p1);转换后的信号的频谱结束结束释放(源)发布(SpectrumAnalyzer44p1)发布(浅黄色)