WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Array in Abschnitte unterteilen

 

voice
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2010, 11:09     Titel: Array in Abschnitte unterteilen
  Antworten mit Zitat      
Hallo,

ich möchte ein X-Beliebiges Signal in 10 Abschnitte unterteilen und jeden Abschnitt seperat in das i.te Glied eines Vektors speichern.

Angenommen ich habe ein Signal 'spec' mit beliebig vielen Werten. Nun möchte ich in der ersten Spalte den Abschnitt aller Werte von 0:1/10*spec haben. In der zweiten Spalte alle Werte zwischen 1/10*sec und 2/10*spec, in der dritten Spalte alle Werte zwichen 2/10*spec und 3/10*spec usw.


Code:

for i = 1:10
     delta_spec(i) = spec((i-1)/10*spec:1/10*i*spec);
end
 



Könnte man das so umsetzen?

Gruß und Dank

voice
Private Nachricht senden Benutzer-Profile anzeigen


voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2010, 11:18     Titel:
  Antworten mit Zitat      
Es gibt bereits einen Fehler. Index darf nicht 0 sein, jedoch wenn ich von 1/10*spec bis 1/10*spec gehe, bekomme ich ja die Differenz 0.

Es muss also anders gehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 25.05.2010, 13:30     Titel:
  Antworten mit Zitat      
Hi,
so
Code:

% Bsp
spec = 1:100;
unt = 1;
obr = 10;
for l = 1:10
     if l ==1
         delta_spec(:,l)=spec([unt:obr],1)
     else l~=1
         unt = unt+10;
         obr = obr+10;
        delta_spec(:,l)=spec([unt:obr],1)
     end
end
 

Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.05.2010, 13:56     Titel:
  Antworten mit Zitat      
Hallo
Eigentlich verstehe ich das so, wenn du sagst, dass du nur solche Werte haben möchtest, welche deine Bereiche erfüllen, dann geht es doch auf ein Vergleich hinaus

Code:

spec= round(rand(1,100)*10)/10
delta_spec= cell(1,10);
for i = 1:10
     delta_spec{i} = spec(abs((i-1)/10)<= spec & spec <= abs(1/10*i));
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2010, 14:51     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort.

Code:
 delta_spec(:,l)=spec([unt:obr],1)
 


Warum ist bei delta_spec(:,l) das :, vor dem l? Waurm nicht nur "An der Stelle von l" ?

Und warum ist bei spec([unt:obr],1) das ,1?


Ich beschäftige mich leider noch nicht all zu lang mit Matlab. Deswegen dürften diese Fragen für den Ein oder Anderen ein wenig lächerlich herüber kommen.

Vielen Dank und Gruß


voice
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.05.2010, 15:01     Titel:
  Antworten mit Zitat      
@denny

Hi,

nein, ich habe vor, ein Audiosignal in kleine Analysefenster aufzusplitten, sodass ich diese kleinen Bereiche kontinuierlich untersuchen kann.

Deswegen möchte ich ein Signal mit beispielsweise 2940 Abtastwerten jeweils in 10ms Festern aufteilen. Die Abtastfrequenz besträgt 8kHz.

Also ist die Gesamtdauer des Audiodatei 2940 / 8000 = 0,3675 s

Wenn ich diese durch 10ms teile, ergibt das eine Anzahl an fenstern von 36,75 Fenstern. Dies fixe ich auf 36.

Ich möchte jetzt also mein Signal in 36 Bereiche aufteilen. Habe ich vorhin wahrscheinlich nicht ganz so verständlich herüber gebracht.

Gruß und Dank


voice
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 25.05.2010, 16:14     Titel:
  Antworten mit Zitat      
Hi,

"Warum ist bei delta_spec(:,l) das :, vor dem l?", weil wir mit l die Spalten kennzeichnen und da du nur die ersten 10 Werte in der ersten Spalten schreiben wolltest.
"Waurm nicht nur "An der Stelle von l" ? " Ich glaube, dass das jetzt klar ist Wink
"Und warum ist bei spec([unt:obr],1) das ,1?", da es sich um eine 100x1 Matrix handelt.

Gruß,
Vito

PS: falls etwas unklar sein sollte einfach melden.
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 25.05.2010, 16:42     Titel:
  Antworten mit Zitat      
Da herrscht ja immer noch ein Missverständnis,
wenn ich jetzt richtig verstehe dann möchtest du doch das:
Code:

spec      = rand(1,2940)
frequenz = 8000; %Hz
fenster = round(length(spec)/(frequenz/100))

delta_spec = nan(1,(frequenz/100)*fenster)

delta_spec(1:length(spec))=spec(:);

delta_spec =reshape(delta_spec,fenster,frequenz/100)

 
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2010, 09:33     Titel:
  Antworten mit Zitat      
Vielen Dank nochmal an Alle für die viele Mühe und Hilfe.

Ich habe das Problem jetzt mit einer einfachen FOR-Loop gelöst und komme jeweils an die Daten innerhalb der Schleife.


Code:

data = [1:100];         % 100 Messwerte
n = 10;                     % 10 Fenster
jump = length(data)/n;
data_part = 1:n;


   
    for j=1:n
       
       
        if j==1
            data_part = data(j:n);
            fprintf('%g \n',data_part);
            k = j*n;
        end
   
        if j~=1
            data_part = data(1+((j-1)*jump):(j)*jump);
            fprintf('%g \n', data_part);
        end
   
   
    end


 



Beim Ausführen komme ich zum erwünschten Ergebnis. Sollte jmd. noch Verbesserungen oder andere gute Ideen einfallen, wäre ich sehr erfreut, wenn ihr mir diese mitteilt.

Vielen Dank nochmal


voice
Private Nachricht senden Benutzer-Profile anzeigen
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 26.05.2010, 09:50     Titel:
  Antworten mit Zitat      
Hi,

du könntest dir einen "if end" sparen
Code:

data = [1:100];         % 100 Messwerte
n = 10;                     % 10 Fenster
jump = length(data)/n;
data_part = 1:n;


   
    for j=1:n
       
       
        if j==1
            data_part = data(j:n);
            fprintf('%g \n',data_part);
            k = j*n;

        elseif j~=1
            data_part = data(1+((j-1)*jump):(j)*jump);
            fprintf('%g \n', data_part);
        end
   
   
    end

 

Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2010, 09:59     Titel:
  Antworten mit Zitat      
Jo, Du hast recht. Vielen Dank.

Jetzt tritt bei mir ein weiteres Problem auf: Es scheint eine Fehlermeldung mit: "??? Index exceeds matrix dimensions.

Error in ==> f0_relmax at 53
data_part = data(j:n);

", was ja bedeutet, dass mein Index meine Matrix Dimension überschreitet. Jedoch weiß ich nicht so ganz, wo das der Fall sein soll:

Code:


sampl = 8000;
sound = wavread('vokal_a');
leng = length(sound);
time = leng/sampl;
anal_win_leng = 0.01;                      % Analyse Fenster von 10ms
anal_win_number = fix(time/0.01);     % Anzahl der Analysefenster (abgerundet)

ham = hamming(leng);
hamsound = sound.*ham;

spec = fft(hamsound);
absolut = abs(spec);
%leng = length(spec);
abs_spec = absolut(1:(leng/2));

freq = (1:length(spec)/2).*8000/length(spec);       % Freq. Auflösung


% ---------------------------------------------------------------------------------


data = [1:abs_spec];                          %
n = anal_win_number;                         %  Fenster
jump = length(data)/n;
data_part = 1:n;

    for j=1:n
       
       
        if j==1
            data_part = data(j:n);
            fprintf('%g \n',data_part);
            k = j*n;
        end
   
        if j~=1
            data_part = data(1+((j-1)*jump):(j)*jump);
            fprintf('%g \n', data_part);
        end
   
   
    end


 



Bei data_part = data(j:n); sollte der Fehler liegen, jedoch weiß ich nicht genau in was für einer Form, wobei es gut sein kann, dass irgendeine Definition oder Deklaration oben falsch gewählt ist.
Private Nachricht senden Benutzer-Profile anzeigen
 
voice
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 77
Anmeldedatum: 29.04.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.05.2010, 10:06     Titel:
  Antworten mit Zitat      
Fehler behoben:

Code:
 data = [1:abs_spec]; ist falsch definiert. Hier die Korrektur
 data = abs_spec;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.