Многоступенчатое преобразование частоты дискретизации звуковых сигналов

Этот пример показывает, как использовать многоступенчатый/многоскоростной подход к преобразованию частоты дискретизации между различными уровнями выборки аудио.

Пример использует dsp.SampleRateConverter. Этот компонент автоматически определяет, сколько этапов, чтобы использовать и разрабатывает фильтр, требуемый для каждого этапа в порядке выполнить преобразование частоты дискретизации в вычислительном отношении эффективным способом.

Этот пример особое внимание при преобразовании звукового сигнала, выбранного на уровне 96 кГц (качество DVD) к звуковому сигналу, выбранному на уровне 44,1 кГц (качество CD).The сравнение, сделан с помощью данных, выбранных на уровне 96 кГц, доступных онлайн по http://src.infinitewave.ca/. В этом примере сигнал щебета на 96 кГц сгенерирован локально так, чтобы никакая загрузка не была необходима.

Настройка

Задайте некоторые параметры, которые будут использоваться в примере.

frameSize = 64;
inFs      = 96e3;

Чтение Файла на 96 кГц

Веб-сайт выше имеет 3 набора файлов в различных качествах в порядке выполнить сравнение. В этом примере особое внимание будет на одном из файлов только: Swept_int.wav. Этот файл содержит синусоиду щебета, развертывающуюся от 0 Гц до 48 кГц в течение 8 секунд. Формат файла является 32-битными целыми числами, учитывая его очень расширенный динамический диапазон.

Здесь вы создаете Системный объект, чтобы читать из звукового файла и определить аудио выборку файла уровня. Если вы хотите использовать wav файл вместо dsp. Щебечите, не прокомментируйте строки ниже и пропустите вызов dsp. Щебет.

источник = dsp. AudioFileReader ('Swept_int.wav'... 'SamplesPerFrame', frameSize... 'OutputDataType', 'дважды');

Генерация Сигнала на 96 кГц

Вместо загрузки файла Swept_int.wav можно также сгенерировать сигнал щебета использование dsp.Chirp можно следующим образом:

source = dsp.Chirp('InitialFrequency',0,'TargetFrequency',48e3,...
    'SweepTime',8,'TargetTime',8,'SampleRate',inFs,...
    'SamplesPerFrame',frameSize,'Type','Quadratic');

Создайте спектр Анализаторы

Создайте два Спектра Анализаторы. Они будут использоваться, чтобы визуализировать содержимое частоты исходного сигнала, а также тот из сигналов, преобразованных в 44,1 кГц.

SpectrumAnalyzer44p1 = dsp.SpectrumAnalyzer(...
    'SampleRate',44100,...
    'ViewType','Spectrum and spectrogram',...
    'TimeSpanSource','Property','TimeSpan',8,...
    'Window','Kaiser','SidelobeAttenuation',220,...
    'YLimits',[-250 50],'ColorLimits',[-150 20],...
    'PlotAsTwoSidedSpectrum',false);

SpectrumAnalyzer96 = dsp.SpectrumAnalyzer(...
    'SampleRate',96000,...
    'ViewType','Spectrum and spectrogram',...
    'TimeSpanSource','Property','TimeSpan',8,...
    'Window','Kaiser','SidelobeAttenuation',220,...
    'YLimits',[-250 50],'ColorLimits',[-150 20],...
    'PlotAsTwoSidedSpectrum',false);

Спектр Исходного Сигнала, Выбранного на уровне 96 кГц

Цикл ниже строит спектрограмму и спектр мощности оригинала 96 kHz сигнал. Сигнал щебета запускается в 0 и развертывается к 48 кГц за моделируемое время 8 секунд.

NFrames = 8*inFs/frameSize;
for k = 1:NFrames
    sig96 = source(); % Source
    SpectrumAnalyzer96(sig96);    % Spectrogram
end
release(source)
release(SpectrumAnalyzer96)

Подготовка Конвертера Частоты дискретизации

В порядке преобразовать сигнал, используется dsp.SampleRateConverter. Первая попытка устанавливает пропускную способность интереса для 40 кГц, т.е. покрывать область значений [-20 кГц, 20 кГц]. Это - обычно принимаемая область значений, которая является слышимой людям. Затухание полосы задерживания для фильтров, которые будут использоваться, чтобы удалить спектральные копии и искаженные копии, оставляют в значении по умолчанию 80 дБ.

BW40 = 40e3;
OutFs = 44.1e3;
SRC40kHz80dB = dsp.SampleRateConverter('Bandwidth',BW40,...
    'InputSampleRate',inFs,'OutputSampleRate',OutFs);

Анализ фильтров, вовлеченных в преобразование

Используйте информацию (), чтобы получить информацию о фильтрах, которые разработаны, чтобы выполнить преобразование. Это показывает, что преобразование будет выполняться на двух шагах. Первый шаг включает десятикратное уменьшение два, фильтруют, который преобразовывает сигнал от 96 кГц до 48 кГц. Второй шаг включает КИХ-конвертер уровня, который интерполирует 147 и десятикратно уменьшает 160. Это приводит к требуемым 44,1 кГц. Команда freqz может использоваться, чтобы визуализировать объединенную частотную характеристику двух включенных этапов. Увеличивание масштаб показывает, что полоса пропускания расширяет до 20 кГц, как задано и что пульсация полосы пропускания находится в области значений миллидБ (меньше чем 0,003 дБ).

info(SRC40kHz80dB)
[H80dB,f] = freqz(SRC40kHz80dB,0:10:25e3);
plot(f,20*log10(abs(H80dB)/norm(H80dB,inf)));
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
axis([0 25e3 -140 5]);
ans =

    'Overall Interpolation Factor    : 147
     Overall Decimation Factor       : 320
     Number of Filters               : 2
     Multiplications per Input Sample: 42.334375
     Number of Coefficients          : 8618
     Filters:                         
        Filter 1:
        dsp.FIRDecimator     - Decimation Factor   : 2 
        Filter 2:
        dsp.FIRRateConverter - Interpolation Factor: 147
                             - Decimation Factor   : 160 
     '

Асинхронный буфер

Преобразование частоты дискретизации от 96 кГц до 44,1 кГц производит 147 выборок для каждых 320 входных выборок. Поскольку сигнал щебета сгенерирован с кадрами 64 выборок, асинхронный буфер необходим. Сигнал щебета записан 64 выборки за один раз, и каждый раз, когда существует достаточно буферизованных выборок, 320 из них читаются и питаются конвертер частоты дискретизации.

buff = dsp.AsyncBuffer;

Основной цикл обработки

Цикл ниже выполняет преобразование частоты дискретизации в потоковой передаче вида. Вычисление достаточно быстро, чтобы действовать в режиме реального времени в случае необходимости.

Спектрограмма и спектр мощности конвертированного сигнала построены. Дополнительные строки в спектрограмме соответствуют спектральным псевдонимам/изображениям, остающимся после фильтрации. Копии ослабляются лучше, чем 80 дБ, как может быть проверен с графиком спектра мощности.

srcFrameSize = 320;
for k = 1:NFrames
    sig96 = source();              % Generate chirp
    write(buff,sig96);      % Buffer data
    if buff.NumUnreadSamples >= srcFrameSize
        sig96buffered = read(buff,srcFrameSize);
        sig44p1 = SRC40kHz80dB(sig96buffered); % Convert sample-rate
        SpectrumAnalyzer44p1(sig44p1);   % View spectrum of converted signal
    end
end

release(source);
release(SpectrumAnalyzer44p1);
release(buff);

Более точный конвертер частоты дискретизации

В порядке улучшить качество конвертера частоты дискретизации, могут быть внесены два изменения. Во-первых, пропускная способность может быть расширена от 40 кГц до 43,5 кГц. Это в свою очередь требует фильтров с более резким переходом. Во-вторых, затухание полосы задерживания может быть увеличено с 80 дБ до 160 дБ. Оба этих изменения происходят за счет большего количества коэффициентов фильтра по всем, а также большего количества умножения на входную выборку.

BW43p5 = 43.5e3;
SRC43p5kHz160dB = dsp.SampleRateConverter('Bandwidth',BW43p5,...
    'InputSampleRate',inFs,'OutputSampleRate',OutFs,...
    'StopbandAttenuation',160);

Анализ фильтров, вовлеченных в преобразование

Предыдущий конвертер частоты дискретизации включил 8 618 коэффициентов фильтра и вычислительную стоимость 42,3 умножения на входную выборку. Путем увеличения пропускной способности и затухания полосы задерживания, стоимость увеличивается существенно до 123 896 коэффициентов фильтра и 440,34 умножения на входную выборку. Частотная характеристика показывает намного более резкий переход фильтра, а также большее затухание полосы задерживания. Кроме того, пульсация полосы пропускания находится теперь в шкале микродБ. ПРИМЕЧАНИЕ: эта реализация включает проект очень длинных фильтров, который занимает несколько минут, чтобы завершиться. Однако это - одна стоимость времени, которая происходит оффлайн (перед фактическим преобразованием частоты дискретизации).

info(SRC43p5kHz160dB)
[H160dB,f] = freqz(SRC43p5kHz160dB,0:10:25e3);
plot(f,20*log10(abs(H160dB)/norm(H160dB,inf)));
xlabel('Frequency (Hz)');
ylabel('Magnitude (dB)');
axis([0 25e3 -250 5]);
ans =

    'Overall Interpolation Factor    : 147
     Overall Decimation Factor       : 320
     Number of Filters               : 2
     Multiplications per Input Sample: 440.340625
     Number of Coefficients          : 123896
     Filters:                         
        Filter 1:
        dsp.FIRDecimator     - Decimation Factor   : 2 
        Filter 2:
        dsp.FIRRateConverter - Interpolation Factor: 147
                             - Decimation Factor   : 160 
     '

Основной цикл обработки

Обработка повторяется с более точным конвертером частоты дискретизации.

Еще раз спектрограмма и спектр мощности конвертированного сигнала построены. Заметьте, что обработка изображений/искажение ослабляется достаточно, что они не видимы в спектрограмме. Спектр мощности показывает спектральные псевдонимы, ослабленные больше чем на 160 дБ (пик на уровне приблизительно 20 дБ).

for k = 1:NFrames
    sig96 = source();             % Generate chirp
    over = write(buff,sig96);      % Buffer data
    if buff.NumUnreadSamples >= srcFrameSize
        [sig96buffered,under] = read(buff,srcFrameSize);
        sig44p1 = SRC43p5kHz160dB(sig96buffered); % Convert sample-rate
        SpectrumAnalyzer44p1(sig44p1);   % View spectrum of converted signal
    end
end

release(source);
release(SpectrumAnalyzer44p1);
release(buff);