如何从MATLAB中的自相关数据中提取特定值?

时间:2010-09-08 20:14:48

标签: matlab math audio correlation

我一直致力于从图(see previous question)中提取峰值,如下所示:

alt text

但是我注意到对于一些xcorr图表,我一直在研究这些值并没有达到预期效果,它们通常看起来更像是这样:

alt text

和此:

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);

很抱歉,这一切看起来都很混乱,但我希望得到一些视觉示例!

2 个答案:

答案 0 :(得分:1)

那些是拐点,如果你采用数据的一阶导数,你会看到它们与一个非常恒定的斜率有很大的偏差。

使用boxcar平均值进行最小平滑,并使用一阶导数来找到那些拐点。

答案 1 :(得分:0)

我相信在二阶导数的负值中找到峰会更容易。常数或接近恒定的斜率将导致2nd-der = 0;其他任何东西,包括你的实际峰值和拐点,都会有一个非零的二阶。通过在负值中找到峰值,您将只获得正峰值,而不是负峰值。