В этом примере показано, как использовать многоступенчатый/многоскоростной подход к преобразованию частоты дискретизации между различными аудио частотами дискретизации.
Пример использует dsp.SampleRateConverter
. Этот компонент автоматически определяет, сколько этапов, чтобы использовать и проектирует фильтр, требуемый для каждого этапа для того, чтобы выполнить преобразование частоты дискретизации в вычислительном отношении эффективным способом.
Этот пример особое внимание при преобразовании звукового сигнала, произведенного на уровне 96 кГц (качество DVD) к звуковому сигналу, произведенному на уровне 44,1 кГц (качество CD).The сравнение, сделан с помощью данных, произведенных на уровне 96 кГц, доступных онлайн в https://src.infinitewave.ca/. В этом примере сигнал щебета на 96 кГц сгенерирован локально так, чтобы никакая загрузка не была необходима.
Задайте некоторые параметры, которые будут использоваться в примере.
frameSize = 64; inFs = 96e3;
Веб-сайт выше имеет 3 набора файлов в различных качествах для того, чтобы выполнить сравнение. В этом примере особое внимание будет на одном из файлов только: Swept_int.wav
. Этот файл содержит синусоиду щебета, развертывающуюся от 0 Гц до 48 кГц в течение 8 секунд. Формат файла является 32-битными целыми числами, учитывая его очень расширенный динамический диапазон.
Здесь вы создаете Системный объект, чтобы читать из звукового файла и определить аудио частоту дискретизации файла. Если вы хотите использовать wav файл вместо dsp.Chirp
, не прокомментируйте линии ниже и пропустите вызов dsp.Chirp
.
источник = dsp.AudioFileReader ('Swept_int.wav'... 'SamplesPerFrame', frameSize... 'OutputDataType', 'дважды');
Вместо загрузки 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 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)