www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Matlab


Autor: karim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!
versuch ein audio signal in Scilab zu programmieren:
Abtastfrequenz:44100HZ
1s stille dann folgt das Audio signal bzw.sinussignal über 2s lang, dann 
3s Stille, und gleichzeitig muss ich der quadratische 
Mittelwert(RMS)rechnen.
g(1:44100)=0;

s=sin(0:88200);

g(44100:132300)=s’;

g(132300:264600)=0;

plot(g);

xtitle(“Audio Signal” , ”Zeit” , “Amplitude”);
playsnd(g,44100);

x=0;

y=0;

for i=1:264600, old=y, i=i+1;

x=(g(i)^2)^0.5;

y=old+x;

end;

A=y*(1/264600)^0.5;

der pc bleibt immer hängen beim rechenen.
woran kann es liegen??an der Pc Leistung??was mache ich falsch?
kann mir bitte jemand helfen?? danke

Autor: Christian (Guest) (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
for i=1:264600, old=y, i=i+1;

x=(g(i)^2)^0.5;

y=old+x;

end;



ich würde die
  i
ausgeben, die gebildet werden.


ist das i=i+l  oder +1  (L  oder Eins ?)

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, da sind nen paar flaws drin:
>> s=sin(0:88200);
die Signalfrequenz ist bei abgetasteten Systemen auf die Abtastfrequenz 
bezogen. Obige Zeile ist nicht, was Du willst. Außerdem hat nen 
Gartenzaun mit 3 Latten zwei Zwischenräume, also hat auch der Vektor 
0:88200 88201 Elemente, also 1 zuviel!

Matlab ohne for ist schneller !
'If you got the ':', you got Matlab'
so in etwa:

fa=44100; %Abtastfrequenz
f =1000;  % Signalfrequenz
s=[zeros(1,1*fa) sin(2*pi*(0:(2*fa)-1)*(f/fa)) zeros(1,3*fa)];
rms=sqrt(sum(s.*s)/length(s));

Cheers
detlef

Autor: karim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi christian!
das ist eine eins
i=i+1

Autor: karim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi detlef!
vielen vieln dank, werd s heute noch probieren und gebe ich dir ein 
feedback.
ciao

Autor: Karim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo detlef,
Habe gerade dein Programm in Matlab ausgeführt, es ist super aber mir 
fällen noch paar kleinichkeiten und zwar:
die stille hier istnur 0,5s und das signal läuft von 0,5 bis 1,4.
und was die RMS angeht ichdachte es wird ohne ende laufen weil man muss 
die schritte von 0 bis 264600 rechnen,(es sind viele ergebnisse)
wäre dir sehr dankbar wenn du mir weiter helfen kannst.
ciao


Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>die stille hier istnur 0,5s und das signal läuft von 0,5 bis 1,4.
Möglicherweise stimmt die Abtastfrequenz dann nicht, die Anzahl der 
samples ist richtig.

>>(es sind viele ergebnisse)

ja, den RMS kann man natürlich für jeden Zeitpunkt ausrechnen, die 
Formel ist für jeden Abtastzeitpunkt auswertbar.

Gute Nacht
Detlef

Autor: karim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen!
erstmal danke für das programm, ja habe nur noch eine kleine bitte und 
zwar die formel in Matlab zu programmieren(weiss die echt schlecht 
dargestellt:-))

von 1 bis 264600 wir die Y gerechnet, die s ist in quadrat und das ganze 
hoch 1/2(wurzel)


              264600
                     2 1/2
    R =(1/264600 ∑(s))
                i=1


hier ist meine lösung aber ergendwie hackt s irgendwo?(bekomme nur 
nullen)
habe die formel in zwei kleine formeln aufgespaltet:erstens die summe 
rechnen dann mit (1/264600)^0.5 multiplizieren.
hast du mal eine lösung??
x=0;

y=0;

for i=1:264600, old=y, i=i+1;

x=(s(i)^2)^0.5; //s ist unser signal


y=old+x;

end;

A=y*(1/264600)^0.5;

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Formel ist mehrfach falsch. Wikipedia: RMS. 
sqrt(a)+sqrt(b)=sqrt(a+b) gilt nur für Spezialfälle.

Cheers
Detlef

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu wave gehört ausser Abtastfrequenz noch Anzahl der
Channels und SampleWidth.
Du machst ja sin(RangeHere) .. aber wenn SampleWidth
auf 2 Byte steht, dann ist [-1..1] eines Sinus zu klein oder?
Dann noch Channels, Du gehst davon aus, dass Du einen
Monosignal erzeugst. Ob Matlab es so handhabt weiss ich nicht.
Ich hab immer mit Python wave Dateien erzeugt
http://docs.python.org/lib/module-wave.html
es geht recht einfach dort.

Grüsse, Daniel

Autor: karim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
abgesehen vom namen Rms,
wie kann ich diese formel in matlab programmieren, ist das richtig was 
ich da geschrieben habe?ansonsten kannst du mir bitte eine lösung 
geben???
danke

Autor: karim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi daniel,
kennen mich mit dem thema nicht ganz gut aus, aber das signal, das mir 
Detlef geschrieben hat, funktioniert super und ich kann mir das signal 
anhören, das ist ja auch ein Monosignal.
danke
ciao

Autor: ajax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Matlab sollte man "i" niemals als Laufindex benutzen, das kann 
teilweise zu ziemlich kurriosen Ergebnissen führen.
Das Zeichen "i" wird auch zur Eingabe des Imaginärteils einer komplexen 
Zahl verwendet.

Gruss,
ajax

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Since both i and j are functions, they can be overridden and used
    as a variable.  This permits you to use i or j as an index in FOR
    loops, etc.<<

Das kommt bei Matlab raus für 'help i', da kann nichts anbrennen. 
Allgemein ist es aber schlecht, in Matlab Laufvariablen zu benutzen, die 
Rechnung wird dann sehr langsam, bis auf ganz wenige Ausnahmen gehts 
ohne Laufvariablen.

Cheers
Detlef

Autor: matlab-anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lerne Matlab oder benutze es nicht. Oben hatte schon jemand darauf 
hingewiesen, daß du Schleifen durch ':' ersetzen sollst. Du ignorierst 
es und wiederholst dich.

>for i=1:264600, old=y, i=i+1;
>
>x=(s(i)^2)^0.5; //s ist unser signal
>
>
>y=old+x;
>
>end;

Durch 'for i=1:264600' zählst du i bereits hoch. Das 'i=i+1' ändert die 
Laufvariable nochmal. Ich würde an deiner Stelle nicht solchen Blödsinn 
verzapfen, wenn du ein lauffähiges Programm haben willst.

Ich habe mich bisher eine knappe Stunde durch ein Scilab-Tutorial 
gearbeitet und kann mir, wenn ich meine und deine Matlab-Kenntnisse 
vergleiche, nicht vorstellen, daß du dich mehr als 5 Minuten mit Matlab 
beschäftigt hast.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.