exponenta event banner

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

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

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

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

Установка

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

frameSize = 64;
inFs      = 96e3;

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

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

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

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

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

Вместо загрузки Swept_int.wav файл, вы также можете генерировать сигнал chirp с помощью 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 кГц. 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)