В этом примере показано, как использовать многоступенчатый/многоскоростной подход для преобразования частоты дискретизации между различными скоростями дискретизации звука.
В примере используется 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-битные целые числа, учитывая его очень высокий динамический диапазон.
Здесь создается системный объект для чтения из аудиофайла и определения частоты дискретизации аудиофайла. Если вы хотите использовать wav файл вместо dsp.Chirp, раскомментируйте строки ниже и пропустите вызов dsp.Chirp.
source = dsp. AudioFileReader (Swept _ int.wav,... 'SamplesPerFrame', frameSize... «OutputDataType», «double»);
Вместо загрузки 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 кГц. Чирп-сигнал начинается с 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)
