Частотная характеристика (FR) является важным инструментом для характеристики точности звукового устройства или компонента.
Этот пример требует звукового устройства, способного записывать и воспроизводить аудио, и соответствующего звукового драйвера. Дополнительные сведения о том, как в примере записываются и воспроизводятся аудиоданные, см. в разделе audioDeviceReader и audioDeviceWriter.
Измерение FR сравнивает выходные уровни звукового устройства с известными входными уровнями. Базовое измерение FR состоит из двух или трех тестовых тонов: среднего, высокого и низкого.
В этом примере выполняется измерение звукового диапазона FR путем сдвига синусоидальной волны от самой низкой частоты в диапазоне до самой высокой. Плоский отклик указывает звуковое устройство, которое одинаково реагирует на все частоты.
В этом примере измерение FR выполняется путем воспроизведения аудиосигнала через audioDeviceWriter и затем запись сигнала через audioDeviceReader. Кабель закольцовывания используется для физического подключения порта аудиовывода звуковой платы к порту аудиовыхода.

Для запуска используйте audioDeviceReader Системные object™ и audioDeviceWriter Системный объект для подключения к аудиоустройству. В этом примере используется аудиоустройство Штейнберга UR44 с частотой дискретизации 48 кГц и размером буфера 1024 выборки.
sampleRate = 48e3; device = 'Yamaha Steinberg USB ASIO'; aDR = audioDeviceReader( ... 'SampleRate',sampleRate, ... 'Device',device, ... 'Driver','ASIO', ... 'BitDepth','16-bit integer', ... 'ChannelMappingSource','Property', ... 'ChannelMapping',1); aDW = audioDeviceWriter( ... 'SampleRate',sampleRate, ... 'Device',device, ... 'Driver','ASIO', ... 'BitDepth','16-bit integer', ... 'ChannelMappingSource','Property', ... 'ChannelMapping',1);
Тестовый сигнал представляет собой синусоидальную волну с 1024 выборками на кадр и начальной частотой 0 Гц. Частота увеличивается с шагом 50 Гц для сдвига диапазона слышимости.
samplesPerFrame = 1024; sineSource = audioOscillator( ... 'Frequency',0, ... 'SignalType','sine', ... 'SampleRate',sampleRate, ... 'SamplesPerFrame',samplesPerFrame);
Используйте dsp.SpectrumAnalyzer для визуализации FR вашей аудиосистемы ввода-вывода. В ходе эксперимента используют 20 средних значений спектральной оценки, а разрешающую полосу частот устанавливают равной 50 Гц. Частота дискретизации устанавливается равной 48 кГц.
RBW = 50; Navg = 20; scope = dsp.SpectrumAnalyzer( ... 'Method','Filter bank', ... 'SampleRate',sampleRate, ... 'RBWSource','Property','RBW',RBW, ... 'SpectralAverages',Navg, ... 'FrequencySpan','Start and stop frequencies',... 'StartFrequency',0, ... 'StopFrequency',sampleRate/2, ... 'ReducePlotRate',false, ... 'PlotAsTwoSidedSpectrum',false, ... 'FrequencyScale','Log', ... 'PlotMaxHoldTrace',true, ... 'ShowLegend',true, ... 'YLimits',[-110 20],... 'YLabel','Power', ... 'Title','Audio Device Frequency Response');
Чтобы избежать влияния времени настройки на измерение FR, предварительно запустите звуковой цикл в течение 5 секунд.
Как только начнется фактическое измерение FR, проскочите тестовый сигнал через диапазон слышимых частот. Используйте анализатор спектра для визуализации FR.
tic while toc < 5 x = sineSource(); aDW(x); y = aDR(); scope(y); end count = 1; readerDrops = 0; writerDrops = 0; while true if count == Navg newFreq = sineSource.Frequency + RBW; if newFreq > sampleRate/2 break end sineSource.Frequency = newFreq; count = 1; end x = sineSource(); writerUnderruns = aDW(x); [y,readerOverruns] = aDR(); readerDrops = readerDrops + readerOverruns; writerDrops = writerDrops + writerUnderruns; scope(y); count = count + 1; end release(aDR) release(aDW) release(scope)

Анализатор спектра показывает два графика. Первый график - оценка спектра последних записанных данных. Второй график представляет собой максимальную мощность анализатора спектра, вычисленную для каждого частотного бина, когда синусоидальная волна прокатывается по спектру. Для получения максимальных данных графика удержания и частотного вектора можно использовать функцию объекта getSpectrumData и постройте только максимальную трассировку удержания.
data = getSpectrumData(scope);
freqVector = data.FrequencyVector{1};
freqResponse = data.MaxHoldTrace{1};
semilogx(freqVector,freqResponse);
xlabel('Frequency (Hz)');
ylabel('Power (dBm)');
title('Audio Device Frequency Response');
График частотной характеристики показывает, что звуковое устройство, протестированное в этом примере, имеет плоскую частотную характеристику в слышимом диапазоне.