Согласно Википедии , кепстр мощности - это (глубокий вдох) квадрат квадрата амплитуды преобразования Фурье логарифма квадрата амплитуды преобразования Фурье сигнала. Так что я думаю, что вы ищете
function c = ceps(frame, win)
c = abs(fft(log10(abs(fft(frame.*win)).^2+eps))).^2;
Обратите внимание, что я изменил одно из ваших имен переменных, потому что WINDOW - это предопределенная функция в панели инструментов обработки сигналов.
Но ifft
и fft
отличаются только масштабным коэффициентом, а внешний abs
не изменит общую форму, так где же леденец, верно? Смотрите далее на странице Википедия .
Синусоидальный ввод времени не даст вам импульса в кепстре. Синус должен дать импульс в спектре , который все равно будет импульсом после операции логмага, который преобразуется в сдвиг уровня в кепстре. Чтобы получить что-то импульсивное в кепстре, вам нужно что-то периодическое в спектре, что означает, что вам нужно что-то с несколькими гармоническими частотами во временной области. Рассмотрим, например, прямоугольную волну:
N = 1024;
h = hann(N, 'periodic');
f = 10;
x = sin(2*pi*f*((1:N)'-1)/N); %#'# to deal with SO formatting
s = 2*(x > 0) - 1; %# square wave
cx = ceps(x, h);
cs = ceps(s, h);
cs
будет иметь ваш желанный леденец, а не cx
.
Кажется, в 0-м кепстральном бункере всегда присутствует большой компонент. Я полагаю, это потому, что операция логарифма всегда заставляет вход второго БПФ иметь большой сдвиг уровня? Кроме того, я не понимаю идею quefrency, я бы ожидал, что леденец будет на N/f
. Так что, возможно, что-то не так с этим кодом, или (что более вероятно) с моим пониманием.