Предисловие
К сожалению, у меня нет в зависимости от того, что -toolbox- Mathworks ставит spectrogram
в, но вот код, который я поставил в общественном достоянии, что делает работу для меня.
Это более практичный, чем spectrogram
, но имеет множество функций последнего, как я продемонстрирую, используя аудиоклип handel
, который поставляется с Matlab ('Hallelujah!').
Настройка
Я не буду считать, что вы знакомы с мерзавцем или Matlab пространств имен.
- Создайте папку с именем
+arf
где-то в пути Matlab (например, ~/Documents/MATLAB
или даже текущий каталог кода).
- Скачать
stft.m
и положить его в +arf/
.
- Также загружается
partition.m
в +arf/
.
Это создает arf
namespace, внутри которого являются arf.stft
и arf.partition
функции (последний используется arf.stft
).
код
clearvars
% Load data: this is an audio clip built into Matlab.
handel = load('handel');
% To hear this audio clip, run the following:
% >> soundsc(handel.y, handel.Fs)
% STFT parameters.
% 1000 samples is roughly 1/8th of a second. A reasonable chunk size.
samplesPerChunk = 1000;
% Overlap a lot between chunks to see a smooth STFT.
overlapSamples = round(samplesPerChunk * 0.9);
% Generate STFT
[stftArr, fVec, tVec] = arf.stft(handel.y, ...
samplesPerChunk, ...
'noverlap', overlapSamples, ...
'fs', handel.Fs);
% Plot results
figure('color', 'white');
imagesc(fVec/1e3, tVec, 20 * log10(abs(stftArr)).');
axis xy
colorbar
xlabel('frequency (KHz)')
ylabel('time (s)')
caxis(max(caxis) - [40 0])
title('`handel` spectrogram via STFT, top 40 dB')
Код выше
- нагрузок
handel
аудио клип, который упакован в Matlab (это девять второй ролик из Георга Фридриха Генделя Мессия),
- определяет некоторые параметры для STFT,
- оценивает STFT с помощью
arf.stft()
и
- земельные участки STFT.
Подсказка: после того, как вы запустите код выше, или просто, что load
линии, вы можете слушать оригинальный клип с soundsc(handel.y, handel.Fs)
.
Результаты
В спектрограммы, вы можете ясно видеть, то две более короткие первых двух длинные Аллилуйя, а затем, наконец, последний длинный. Время идет вдоль оси y, как вы хотели.
Код демонстрирует, как указывать длину куска (здесь 1000 выборок или ≈⅛ секунд) и количество перекрытий (90% длины блока, так что 900 образцов перекрытия). Примечание:
- Большая длина куска приведет к меньшему разрешению во времени (но большее разрешение по частоте).
- Чем меньше перекрытие, тем больше царапин и менее плавный STFT появляется во времени (и тем меньше вычислительных/накладных расходов памяти вы платите). Количество перекрытий должно быть между 0 (без перекрытия между кусками) и
chunk size - 1
.
Если вы просто поиграете с длиной куска, вы почувствуете основную ручку, которую STFT дает вам настроить. Обычно один выбор перекрывает между 25% или 50% размера блока для разумно гладких спектрограмм без огромного количества вычислительных накладных расходов.
N.B. Вы можете увеличить гладкость по частоте , передав дополнительный аргумент arf.stft
, в частности, arf.stft(..., 'nfft', 2^nextpow2(samplesPerChunk * 8))
. Это явно задает количество создаваемых частотных бункеров (в конечном итоге оценивается БПФ такого размера). Значение по умолчанию эквивалентно 2^nextpow2(samplesPerChunk)
, поэтому умножение на восемь будет увеличивать спектр для каждого фрагмента в восемь раз.
Я отправил долгожданный ответ с использованием пользовательского кода, но я думаю, что основная проблема заключается в том, что вы используете слишком маленький 'windowSize'. 256 выборок даже при 8 кГц составляет всего 30 миллисекунд. Попробуйте достаточно образцов в течение 1-3 секунд, это ближе к тому, что использует вторая «авторитетная» спектрограмма. –