Forum: Digitale Signalverarbeitung / DSP / Machine Learning Matlab merge


von Andreas S. (nightmarevs)


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

von pumpkin (Gast)


Lesenswert?

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

Oder dasselbe Signal zweimal haben?
1
zwei = eins;

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

von Andreas S. (nightmarevs)


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.

von pumpkin (Gast)


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.

von Andreas S. (nightmarevs)


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
1
  int x = 0;
2
  for(x=0;x<15998;x++)
3
  {
4
    delay[x]=delay[x+1];
5
  }
6
  delay[15999]=sample;
7
  if(delay[0] !=0)
8
  {
9
    sample = (sample + delay[0] )/2;
10
  }
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)

von besser so (Gast)


Lesenswert?

Das Verzögern realisiert man am besten mittels Ringpuffer, was viel 
effizienter als Deine Variante ist:
1
#define MAX_DELAY 15999
2
int16_t delay[MAX_DELAY];
3
int writepos;
4
5
for (int i=0; i<MAX_DELAY; i++)
6
   delay[i] = 0;
7
8
...
9
10
delay[writepos++] = sample
11
if (writepos >= MAX_DELAY)
12
   writepos = 0;
13
14
int readpos = writepos - 1 - num_samples_delay;
15
if (readpos < 0)
16
   readpos += MAX_DELAY;
17
18
out = (sample + delay[readpos] + 1) >> 1;

von Andreas S. (nightmarevs)


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?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.