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