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
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; |
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.
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.
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)
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; |
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.