我一直致力于从图(see previous question)中提取峰值,如下所示:
但是我注意到对于一些xcorr图表,我一直在研究这些值并没有达到预期效果,它们通常看起来更像是这样:
和此:
alt text http://a.imageshack.us/img836/7236/plotgraphcopy.jpg
不是试图像第一个数字中的代码那样尝试选择峰值,而是如何尝试选择下降斜率暂时均匀的值(如图3所示)?
当我尝试以类似于图2和图2中所示的数据运行当前状态的代码时。 3,我没有得到任何有用的数据作为回报。
我认为我需要在'find extrema points'部分中使用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 :(得分:1)
那些是拐点,如果你采用数据的一阶导数,你会看到它们与一个非常恒定的斜率有很大的偏差。
使用boxcar平均值进行最小平滑,并使用一阶导数来找到那些拐点。
答案 1 :(得分:0)
我相信在二阶导数的负值中找到峰会更容易。常数或接近恒定的斜率将导致2nd-der = 0;其他任何东西,包括你的实际峰值和拐点,都会有一个非零的二阶。通过在负值中找到峰值,您将只获得正峰值,而不是负峰值。