2010-09-08 4 views
1

Я работаю по извлечению пиковых значений из графика (see previous question) который выглядит следующим образом:Как извлечь определенные значения из автокоррелированных данных в MATLAB?

alt text

, но я заметил, что для некоторых из xcorr графиков я работал на значениях не превращайте как ожидалось, и они обычно оказываются больше похож так:

alt text

и это:

alt text http://a.imageshack.us/img836/7236/plotgraphcopy.jpg

Вместо того, чтобы пытаться выбрать пиковые значения, как это делал код на первом рисунке, как бы я попытался выбрать значения, когда нисходящий наклон моментально исчезает (как показано на рисунке 3)?

Когда я пытаюсь запустить код в его текущем состоянии по данным, подобным показанному на рисунке 2 & 3, я не получаю никаких полезных данных обратно.

Я думаю, что мне нужно утверждение if или подобное в разделе «найти точки экстремума», но я не уверен, правильно это или нет. Мой .М код функции выглядит следующим образом до сих пор:

[inputname, pathname] = uigetfile('*.wav', 'Select WAV-file'); 

thumb1 = inputname;    %# Get filename information 
fprintf('\n%s is being turned into a 30s thumbnail...\n', thumb1); 
fprintf('Please wait..!\n\n'); 
%# load the signal 
[y, fs, nb] = wavread(thumb1); 
y = mean(y,2);        %# stereo, take avrg of 2 channels 

%# Calculate frame energy 
fWidth = round(fs*1);     %# 10ms 
numFrames = floor(length(y)/fWidth); 
energy = zeros(1,numFrames); 
for f=1:numFrames 
    energy(f) = sum(y((f-1)*fWidth+1:f*fWidth).^2); 
end 

%# smooth the signal (moving average with window size = 1% * length of data) 
WINDOW_SIZE = round(length(energy) * 0.01); %# 200 
XX = filtfilt(ones(1,WINDOW_SIZE)/WINDOW_SIZE, 1, energy); 

%# auto-correlation 
[r,lags] = xcorr(XX, 'biased'); 

%# find extrema points 
dr = diff(r); 
eIdx = find(dr(1:end-1) .* dr(2:end) <= 0) + 1; 

[~,loc] = sort(r(eIdx), 'descend'); 
loc = loc(1:min(3,end));      %# take the highest 3 values 

inf=lags(eIdx(loc)); 

thumb=max(inf); 

startrecord=round((thumb/1)*fs); 
endrecord=round(((thumb+30)/1)*fs); 

wavwrite(y(startrecord:endrecord), fs, nb, 'Temp1'); 
fprintf('The thumbnail of %s has been created.\n\n', thumb1); 

Извините, что все это выглядит так грязно, но я хотел бы получить некоторые визуальные примеры в!

+0

Чтобы дать надлежащий контекст, вы должны, возможно, упомянуть свой предыдущий вопрос (так как это в некотором роде продолжение) – Amro

+1

@Amro: Я добавил ссылку. – Jonas

ответ

1

Это точки перегиба, и если вы берете первую производную от ваших данных, вы увидите их как большие отклонения от довольно постоянного наклона.

Играйте с средним вагоном, чтобы выполнить минимальное сглаживание и с первой производной, чтобы найти те точки перегиба.

+0

Видя, как уже применяется сглаживание, применяемое к сигналу, я полагаю, что я должен работать только над поиском первой производной? Я немного оглядывался, но, честно говоря, я не очень хорош в математике, поэтому многое из того, что говорится, идет прямо над моей головой. Я думаю, что я должен использовать функцию градиента, чтобы найти значения? Это по правильной линии? – Velocity

+0

Я не знаком с математикой. Попробуйте функцию градиента данных, чтобы увидеть, как она выглядит. Точки перегиба будут выглядеть как максимумы/минимумы. Функция должна быть плоской и положительной перед пиком, а затем пересекать ось х и быть плоской и отрицательной после. – Marco

0

Я считаю, что легче найти пики в отрицательном значении второй производной. Постоянный или почти постоянный наклон приведет к 2-й степени = 0; все остальное, включая ваши фактические пики и точки перегиба, будет иметь ненулевой 2-й уровень. Найдя пики отрицательных значений, вы получите только положительные пики, а не отрицательные пики.

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