2016-07-13 7 views
2

В рамках исследовательского проекта я хотел бы проанализировать звуковой файл, создав его спектрограмму.Как сгенерировать спектрограмму wav-файла в Matlab с частотой по оси x

Я смог успешно сгенерировать спектрограмму волнового файла в матлабе с частотой по оси y и временем на оси x. Однако я хотел бы сгенерировать спектрограмму с частотой по оси х и временем на оси у. Как это может быть сделано?

Я просмотрел стек и не нашел принятых ответов.

Мой код, который генерирует спектрограмма с частотой на YAxis и времени на оси х (Matlab код):

[song, fs] = wavread('filename.wav'); 
windowSize = 256; 
windowOverlap = []; 
freqRange = 0:300; 
spectrogram(song, windowSize, windowOverlap, freqRange, fs, 'yaxis'); 

Я изменил параметр «YAxis» в функции спектрограмме, чтобы «xaxis», и частота теперь находится на оси x со временем по оси y. Но я получаю спектрограмму, отличную от того, что генерируется из надежного источника.

Вот спектрограмма, что я произвожу - spectrogram

Спектрограмма генерируется из надежного источника (у меня нет кода).

reliable_spectrogram

Кроме того, цветовая схема отличается в обоих спектрограмм. И моя запись длится 50 секунд, тогда как время, отображаемое на этикетке, составляет 9 секунд. Как я могу решить эти проблемы?

Моя конечная задача заключается в создании спектрограммы на устройстве Android (возможно, с использованием библиотеки GraphView в android). Поэтому мне пришлось бы писать код для создания спектрограммы в Java.

Любая помощь на это очень ценится.

+0

Я отправил долгожданный ответ с использованием пользовательского кода, но я думаю, что основная проблема заключается в том, что вы используете слишком маленький 'windowSize'. 256 выборок даже при 8 кГц составляет всего 30 миллисекунд. Попробуйте достаточно образцов в течение 1-3 секунд, это ближе к тому, что использует вторая «авторитетная» спектрограмма. –

ответ

3

Предисловие

К сожалению, у меня нет в зависимости от того, что -toolbox- Mathworks ставит spectrogram в, но вот код, который я поставил в общественном достоянии, что делает работу для меня.

Это более практичный, чем spectrogram, но имеет множество функций последнего, как я продемонстрирую, используя аудиоклип handel, который поставляется с Matlab ('Hallelujah!').

Настройка

Я не буду считать, что вы знакомы с мерзавцем или Matlab пространств имен.

  1. Создайте папку с именем +arf где-то в пути Matlab (например, ~/Documents/MATLAB или даже текущий каталог кода).
  2. Скачать stft.m и положить его в +arf/.
  3. Также загружается partition.m в +arf/.

Это создает arfnamespace, внутри которого являются 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') 

Код выше

  1. нагрузок handel аудио клип, который упакован в Matlab (это девять второй ролик из Георга Фридриха Генделя Мессия),
  2. определяет некоторые параметры для STFT,
  3. оценивает STFT с помощью arf.stft() и
  4. земельные участки STFT.

Подсказка: после того, как вы запустите код выше, или просто, что load линии, вы можете слушать оригинальный клип с soundsc(handel.y, handel.Fs).

Результаты

STFT of handel Hallelujah clip

В спектрограммы, вы можете ясно видеть, то две более короткие первых двух длинные Аллилуйя, а затем, наконец, последний длинный. Время идет вдоль оси 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), поэтому умножение на восемь будет увеличивать спектр для каждого фрагмента в восемь раз.

+0

Позвольте мне попробовать это сегодня и посмотреть, могу ли я отметить это как правильный ответ. – aditya

Смежные вопросы