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