Мне нужно извлечь основную частоту из WAV-файла длиной 1 секунда.
Я просмотрел несколько вариантов, таких как поиск пиков или создание сложного кепстра, но пока не повезло.За последние пару недель я много читал об этом, но все же не могу найти жизнеспособный и оптимальный способ сделать это.Я новичок в Matlab и обработке сигналов.
filedir = dir('*.wav');
[y, Fs] = audioread(filedir.name);
x = y(y ~= 0) % removing the zeroes from the array
psdest = psd(spectrum.periodogram,x,'Fs',Fs,'NFFT',length(x));
[~,I] = max(psdest.Data);
fprintf('Maximum occurs at %d Hz.\n',psdest.Frequencies(I));
Вывод, например: Максимум происходит при 5,758645e + 02 Гц
Возможно, мне понадобится преобразовать это число в Гц.
Для сложного кепстра:
load mtlb
dt = 1/Fs;
I0 = round(0.1/dt);
Iend = round(1/dt);
x = mtlb(I0:Iend);
c = cceps(x);
t = 0:dt:length(x)*dt-dt;
trng = t(t>=2e-3 & t<=10e-3);
crng = c(t>=2e-3 & t<=10e-3);
[~,I] = max(crng);
fprintf('Complex cepstrum F0 estimate is %3.2f Hz.\n',1/trng(I))
clearvars
Выходные значения одинаковы для всех файлов, которые я загружаю, так что явно что-то не так.
Я боролся зав то время как я действительно должен понять это.Чтобы извлечь эту основную частоту.Я использую Matlab 2016b.
Большое спасибо!