gpt4 book ai didi

matlab - 如何从 MATLAB 中的自相关数据中提取峰值?

转载 作者:太空宇宙 更新时间:2023-11-03 19:51:54 25 4
gpt4 key购买 nike

我有关于音轨的信息(20,000 帧数据),我使用以下方法自动关联:

[r,lags] = xcorr(XX,XX,'biased');

它看起来像这样:

alt text

希望到目前为止一切顺利。理想情况下,我希望能够获取与第二个峰值的最高部分相对应的帧号。我已经阅读并尝试了很多不同的方法,但我似乎无法让它为我检索信息。

有人能阐明我必须做什么吗?

非常感谢!


编辑1:我试过使用 findpeaks,但它似乎对我不起作用。我不确定那是不是因为我使用了错误的数据。

edit2: 我目前正在测试一种仅用于此音轨的方法,但很快我想扩展它以便我可以对整个文件目录执行此方法,所以我有点需要一个可以检测峰值的脚本,而不是自己查找信息。

edit3: 我的 .M 文件:

[y, fs, nb] = wavread('Three.wav');                 %# Load the signal into variable y

frameWidth = 441; %# 10ms
numSamples = length(y); %# Number of samples in y
numFrames = floor(numSamples/frameWidth); %# Number of full frames in y
energy = zeros(1,numFrames); %# Initialize energy
startSample = zeros(1,numFrames); %# Initialize start indices
endSample = zeros(1,numFrames); %# Initialize end indices

for frame = 1:numFrames %# Loop over frames
startSample(frame) = (frame-1)*frameWidth+1; %# Starting index of frame
endSample(frame) = frame*frameWidth; %# Ending index of frame
frameIndex = startSample(frame):endSample(frame); %# Indices of frame samples
energy(frame) = sum(y(frameIndex).^2); %# Calculate frame energy
end %# End loop

XX = filtfilt(ones(1,10)/10, 1, energy); %# Smooths signal

[r,lags] = xcorr(XX,XX,'biased'); %# Auto-correlates the data
plot(lags,r), xlabel('lag'), ylabel('xcorr') %# Plots data

最佳答案

编辑:

%# load the signal
[y, fs, nb] = wavread('Three.wav');
y = mean(y,2); %# stereo, take avrg of 2 channels

%# Calculate frame energy
fWidth = round(fs*10e-3); %# 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

%# plot
plot(lags,r), hold on
plot(lags(eIdx), r(eIdx), 'g*')
plot(lags(eIdx(loc)), r(eIdx(loc)), 'ro')
hold off, xlabel('lag'), ylabel('xcorr')

alt text

和标记峰对应的滞后值:

>> lags( eIdx(loc) )
ans =
0 -6316 6316

请注意,我们在计算自相关函数的导数之前对信号进行了平滑处理,以便找到 extrema points

关于matlab - 如何从 MATLAB 中的自相关数据中提取峰值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3495892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com