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

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

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

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

Setup

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

frameSize = 64;
inFs      = 96e3;

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

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

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

source = dsp. AudioFileReader ('Swept _ int.wav',... 'SamplesPerFrame', frameSize,... 'OutputDataType', 'double');

Генерация сигнала 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 кГц. Сигнал щебета начинается с 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);

Анализ фильтров, участвующих в преобразовании

Использование info для получения информации о фильтрах, предназначенных для выполнения преобразования. Это показывает, что преобразование будет выполнено в два этапа. Первый шаг включает десятикратное уменьшение двумя фильтрами, который преобразует сигнал с 96 кГц в 48 кГц. Второй этап включает преобразователь скорости конечной импульсной характеристики, который интерполируется на 147 и децимирует на 160. Это приводит к необходимости в 44,1 кГц. The 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);

Анализ фильтров, участвующих в преобразовании

Предыдущий преобразователь частоты дискретизации включал 8618 коэффициентов фильтра и вычислительные затраты 42,3 умножения на входную выборку. Путем увеличения ширины полосы пропускания и затухания в полосе задерживания стоимость существенно увеличивается до 123896 коэффициентов фильтрации и 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)