Domanda

Ho lavorato estraendo i valori di picco da un grafico (vedi domanda precedente) che assomiglia a questo:

alt text

, ma ho notato che per alcuni dei grafici xcorr ho lavorato sui valori non risultano come previsto e che normalmente risultano più simile a questo:

alt text

e questo:

alt text

Invece di cercare di raccogliere i valori di picco come il codice stava facendo nella prima figura, come andrei circa cercando di scegliere i valori in cui la discesa si uniforma momentaneamente fuori (come mostrato in figura 3)?

Quando provo ed eseguire il codice nel suo stato attuale sui dati come quelli mostrati in figura 2 e 3, non ho ricevuto alcuna indietro dati utili in cambio.

Penso che ho bisogno di un'istruzione if o simile nella sezione 'trovare punti Extrema', ma io non sono sicuro se questo sia corretto o meno. Il mio codice .M per gli sguardi funzione come questa fino ad ora:

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

Ci dispiace che sembra tutto così disordinato, ma volevo ottenere alcuni esempi visivi in!

È stato utile?

Soluzione

Questi sono flessi, e se si prende la derivata prima dei dati si vedrà chi come grandi deviazioni da una pendenza costante abbastanza.

Giochi con una media carro merci per fare levigatura minima e con la derivata prima di trovare quei punti di flesso.

Altri suggerimenti

Credo che sarà più facile trovare picchi del valore negativo della derivata seconda. Costante o pendenza quasi costante comporterà 2a-der = 0; ogni altra cosa, inclusi i picchi reali e punti di flesso, avrà un diverso da zero secondo-der. Trovando i picchi nei valori negativi, si otterrà solo i picchi positivi, non i picchi negativi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top