Я работаю по извлечению пиковых значений из графика (see previous question) который выглядит следующим образом:Как извлечь определенные значения из автокоррелированных данных в MATLAB?
, но я заметил, что для некоторых из xcorr графиков я работал на значениях не превращайте как ожидалось, и они обычно оказываются больше похож так:
и это:
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);
Извините, что все это выглядит так грязно, но я хотел бы получить некоторые визуальные примеры в!
Чтобы дать надлежащий контекст, вы должны, возможно, упомянуть свой предыдущий вопрос (так как это в некотором роде продолжение) – Amro
@Amro: Я добавил ссылку. – Jonas