www.mikrocontroller.net

Forum: Digitale Signalverarbeitung / DSP Matlab merge


Autor: Andreas S. (nightmarevs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,
Ich habe mich in lezter Zeit ein wenig mit Matlab beschäftigt und bin 
nun dabei einen Chorus zu realisieren. Meiner meinung nach ist es am 
einfachsten Die Audiodatei in 2 Spuren aufzuteilen (1. Problem) die 
zweite mit einem delay ein wenig versetzen und dann mit merge (2. 
Problem) wieder zusammenzuführen.

Nun zu meinen Fragen:

1.Wie kann ich den Audio Input splitten? Wenn ich einfach eine 
Verzweigung in die Leitung ziehe meckert Matlab.

2.Wie funktioniert merge in Matlab wenn ich 2 Signale an einen merge 
block schliese kommt immer nur eines heraus. Ist merge vll. der falsche 
Ansatz?

Danke im voraus
nightmarevs

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu 1. Was meinst du mit splitten? Links/rechts?
in = wavread('foo.wav');
in_l = in(:,1);
in_r = in(:,2);

Oder dasselbe Signal zweimal haben?
zwei = eins;

Und du willst dasselbe Signal mit sich selbst überlappen?
sum = (eins + zwei) / 2;

Autor: Andreas S. (nightmarevs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Erst mal danke für die Hilfe,
Genau ich will das Signal das ich von einem Audio Codec einlese Zwei mal 
haben und das eine dann dem zweiten zeitversezt hinzufügen. Bisher habe 
ich nur ein wenig Erfahrung mit Simulink und da will er Summe nicht 
akzeptieren und wenn ich das ganze mit merge zusammenführen will kommt 
nur die mit delay verzögerte spur.

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach herje, Simulink. Ich kann mir vorstellen dass er die Addition 
deswegen nicht mag, weil die Arrays nach dem Delay unterschiedlich groß 
sind -> prüfen.

Autor: Andreas S. (nightmarevs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das könnte natürlich sein, ich werde das gleich morgen prüfen.

Ich habe jezt versucht das ganze in C zu realisieren dabei ist meinem 
wirren Geist folgendes Entsprungen:

delay ist ein Uint32 Array mit 15999 Stellen das am Anfang mit 0 
Initialisiert wird

sample ist der Wert der vor diesem Code Segment eingelesen und danach 
Ausgegeben wird
  int x = 0;
  for(x=0;x<15998;x++)
  {
    delay[x]=delay[x+1];
  }
  delay[15999]=sample;
  if(delay[0] !=0)
  {
    sample = (sample + delay[0] )/2;
  }

Wenn ich das allerdings laufen lasse habe ich die ganze Zeit 
Störgeräusche im Ton? Woran kann das liegen. Dieser Code wird jedesmal 
wenn ein sample eingelesen wird ausgeführt (16kHz)

Autor: besser so (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Verzögern realisiert man am besten mittels Ringpuffer, was viel 
effizienter als Deine Variante ist:

#define MAX_DELAY 15999
int16_t delay[MAX_DELAY];
int writepos;

for (int i=0; i<MAX_DELAY; i++)
   delay[i] = 0;

...

delay[writepos++] = sample
if (writepos >= MAX_DELAY)
   writepos = 0;

int readpos = writepos - 1 - num_samples_delay;
if (readpos < 0)
   readpos += MAX_DELAY;

out = (sample + delay[readpos] + 1) >> 1;


Autor: Andreas S. (nightmarevs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ besser so
Danke für die Info, leider funktioniert dein Vorschlag nicht. Ich habe 
versucht ihn zum laufen zu bringen (einzige änderung ich Arbeite mit 
Uint32 da die BSL keine anderen datentypen unterstüzt). Wenn ich deinen 
Code abspiele wir gar nichts mehr ausgegeben (es sei denn die lezte 
Zeile ist ausgeklammert ;) )
Weiß irgendjemand was ich an dem Programm ändern muss damit es läuft?

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.