كيفية استخراج قيم محددة من البيانات المرتبطة تلقائيًا في MATLAB؟

StackOverflow https://stackoverflow.com/questions/3671532

سؤال

لقد كنت أعمل على استخراج قيم الذروة من الرسم البياني (راجع السؤال السابق) الذي يبدو مثل هذا:

alt text

لكنني لاحظت أنه بالنسبة لبعض الرسوم البيانية xcorr التي كنت أعمل عليها، لا تظهر القيم كما هو متوقع وعادةً ما تبدو أكثر مثل هذا:

alt text

وهذا:

alt text

بدلاً من محاولة اختيار قيم الذروة كما كان يفعل الكود في الشكل الأول، كيف سأحاول اختيار القيم التي يتساوى فيها المنحدر الهبوطي بشكل مؤقت (كما هو موضح في الشكل 3)؟

عندما أحاول تشغيل الكود في حالته الحالية على بيانات مثل تلك الموضحة في الشكل 2 و3، لا أحصل على أي بيانات مفيدة في المقابل.

أعتقد أنني بحاجة إلى عبارة if أو ما شابه ذلك في قسم "البحث عن النقاط القصوى" ولكني لست متأكدًا مما إذا كان ذلك صحيحًا أم لا.يبدو رمز .M الخاص بالوظيفة كما يلي حتى الآن:

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

آسف لأن كل شيء يبدو فوضويًا للغاية، لكني أردت الحصول على بعض الأمثلة المرئية!

هل كانت مفيدة؟

المحلول

هذه هي نقاط الانعكاس، وإذا أخذت المشتقة الأولى من بياناتك، فسترى تلك الانحرافات الكبيرة عن منحدر ثابت جدًا.

العب باستخدام متوسط ​​عربة النقل للقيام بالحد الأدنى من التجانس ومع المشتق الأول للعثور على نقاط الانعكاس تلك.

نصائح أخرى

أعتقد أنه سيكون من الأسهل العثور على قمم في القيمة السلبية للمشتق الثاني. سيؤدي المنحدر الثابت أو الثابت تقريبًا إلى 2nd-MER = 0 ؛ أي شيء آخر ، بما في ذلك الذروة الفعلية ونقاط الانعكاس ، سيكون له جهاز ثانٍ غير صفري. من خلال إيجاد قمم في القيم السلبية ، ستحصل فقط على القمم الإيجابية ، وليس القمم السلبية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top