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

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

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

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

Настройка

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

frameSize = 64;
inFs      = 96e3;

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

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

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

источник = 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 кГц, i.e. покрывать область значений [-20 кГц, 20 кГц]. Это - обычно принимаемая область значений, которая является слышимой людям. Затухание в полосе задерживания для фильтров, которые будут использоваться, чтобы удалить спектральные копии и искаженные копии, оставляют в значении по умолчанию 80 дБ.

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

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

Используйте info получить информацию о фильтрах, которые спроектированы, чтобы выполнить преобразование. Это показывает, что преобразование будет выполняться на двух шагах. Первый шаг включает децимацию два, фильтруют, который преобразует сигнал от 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)