Hi gute Frage mir fällt da auch nicht wirklich ne einfache Lösung ein. Die ersten Peaks könntest du ja mit max rausfinden von da ab gibts vielleicht noch ein paar performantere Lösungen. (Allerdings keine eleganteren). Zb könntest du die max. Werte, welche konsekutiv zu dem ersten Max wert sind so länge löschen, bis einer nicht konsekutiv ist, dass ist dann dein 2. Peak. Ist nur so ne Idee.
klingt irgendwie nach while und damit nach schleife und somit auch langsam.
Ich bin inzwischen auf die Idee gekommen, man könnte die matrix mit reshape in einen Vektor ändern, die lokalen Maxima bestimmen und anschließend anhand des Index wieder eine Matrix befüllen. Dann könnte man mit max-Maximumlöschen-max die beiden Maxima bestimmen.
Bei der Umsetzung in Code hapert es aber leider noch...
ja wie gesagt ist halt leider keine besonders elegante (Schleifenlose) Variante. Ich verstehe deinen Ansatz aber nicht so richtig, ich meine ok die lokalen maximalwerte eines Vektor is Ok, aber danach? Der 2. Peak ist ja nicht auch der 2. Maximalwert. Vielleicht könntest du das für mich nochmal etwas genauer erklären.
Meiner Meinung nach gäbe es nur einen eleganten Ansatz, wenn man den ersten Peak, ausgehend vom Maximum komplett auslöschen könnte. Dies würde aber eigentlich nur gehen, wenn du zum Beispiel weist, dass zwischen 2 Peaks immer ein Wert (z.B. 0) vorher unterschritten wird. Bzw. ich kenne gerade keinen anderen Weg.
Ahh ok, ja jetzt kann ichs mir auch vorstellen. Ist so besser als meine erste Idee. Würde aber noch statt sort einmal das Maximum nehmen von jedem Teilabschnitt der Peaks, und dann noch das Maximum, nachdem der Peak entfernt wurde, aber auch nur in diesem Teilabschnitt. Also mit reshape, den peakvektor in eine matrix zurückwandeln und dann max bilden, danach die max peaks aus der matrix entfernen und nochmal max bilden. Danach testen ob das wirklich schneller als sort ist.
Hallo,
danke euch beiden für die Hilfe. Ich habe es, für meine Funktion zum finden von auftretenden Frequenzen in einem Signal, jetzt folgendermaßen umgesetzt:
Code:
function[freq_sort]=data2freq(data, abtastrate)
%[freq_sort]=data2freq(data, abtastrate)
%data muss die Form [Frames,Sensoren] haben.
ifsize(data,1)==1
data=data';
end
frames = size(data,1); % Anzahl der frames in data
N = frames*4; % Länge der FFT % --- entfernt den DC Anteil aus den Daten ---
data = data-repmat(mean(data),frames,1);
% --- eigentliche fft ---
fourier = abs(fft(data,N));
% --- nimmt nur die erste hälfte der fft da rest spiegelbildlich ---
fourier_halbe=fourier(1:ceil(end/2),:);
% --- macht aus matrix einen vektor
B=fourier_halbe(:);
% --- findet die lokalen Maxima [peak, index]=findpeaks(B);
% --- erzeugt aus vektor wieder matrix ---
C=zeros(size(fourier_halbe));
C(index)=peak;
% --- sortiert die gefundenen Frequenzmaxima --- [peak_s ind]=sort(C,1,'descend');
% --- rechnet von der Position des lokalen maximums auf die Frequenz ---
freq_sort = abtastrate/N * (ind-1);
% --- Code mit Schleife --- % peaks=NaN(2,size(data,2)); % for spalten=1:size(data,2) % [pks,locs] = findpeaks(fourier(1:N/2,spalten),'sortstr','descend'); % peaks(1:2,spalten)=[locs(1)-1;locs(2)-1]; % end % % --- gibt die beiden frequenzen mit höchster Amplitude aus --- % freq_ampmax = abtastrate/N * peaks(1,;%(locs(1)-1); % freq_amp2ter = abtastrate/N * peaks(2,;%(locs(2)-1);
Die Lösung ist zwar vielleicht nicht eleganter, aber sicherlich perfomanter als die Schleifenlösung. Außerdem habe ich wieder was dabei gelernt. .-)
Vielen dank!
Schrank
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.