0 Daumen
850 Aufrufe

Aufgabe:

Mit Hilfe von sinusförmigen Funktionen

x(n) = A cos(2πfnT + φ) (1)

Signale erzeugt und ausgegeben. Hierbei ist T =1/fs das Abtastintervall mit der Abtastfrequenz fs = 8000 Hz, n ist der Zeitindex des Signals, f die gewünschte Frequenz, φ eine zufällige Phase im Bereich von 0 bis 2π und A die Amplitude.

a) Erstellen Sie eine Funktion, die ein Sinussignal gegebener Frequenz frequency, Abtastfrequenz fs, zeitlicher Dauer in Sekunden duration und Amplitude A erzeugt.

Benutzen Sie [sinusoid] = createWaveform(frequency,fs,duration,A) als Funktionskopf. Schreiben Sie das Skript welches Ihre Funktion testet, indem zwei Signale mit den Frequenzen f1 = 440 Hz und f2 = 1000 Hz und einer Dauer
von 2 Sekunden erzeugt und mittels der Funktion sound augegeben werden.

b) In der Musik ist der Grundton A4 mit 440 Hz festgelegt. Eine Oktave höher bedeutet eine Verdopplung der Frequenz und eine Oktave tiefer eine Halbierung der Frequenz. Eine Oktave beinhaltet 12 Töne, so dass das Frequenzverhältnis zwischen zwei benachbarten Tönen r =12√2 (2) beträgt.

So hat zum Beispiel das C4, welches 9 Töne unter A4 liegt, eine Frequenz von etwa 261,6 Hz.

Eine Note im Notenblatt definiert zusätzlich zur Tonhöhe auch die Tondauer in den relativen Längen von 1, 1/2, 1/4 und so weiter.

Schreiben Sie die Funktion

[tone] = note(keynum,relDuration,fullDuration,fs)

die ein Signal zu einer Note generiert. Hierbei ist keynum die Tastennummer gemäß Abbildung 1, relDuration die Notenlänge und fullDuration die vorgegebene Dauer einer ganzen Note in Sekunden.

c) Ein Signal, welches mehrere Töne hintereinander beinhaltet, kann erzeugt werden, indem die Signale der einzelnen Noten zu einem Vektor konkateniert werden. Schreiben Sie das Skript AufgabeC.m, in dem die Tonleiter (weiße Tasten einer Oktave) vorwärts und rückwärts abgespielt wird.

d) Eine so erzeugt Tonfolge klingt sehr künstlich. Ein natürlicher Klang kann erreicht werden, indem die Amplitude über die Zeit variiert wird. Ein einfaches Modell ist dabei die ADSRKurve aus Abbildung 3. Sie definiert 4 Phasen, die die Intensität des Tastenanschlags und das Ausschwingen grob beschreiben. Die vier Phasen sind: A – attack, D – delay, S – sustain und R – release.

Abbildung 3: ADSR-Kurve.

Schreiben Sie eine Funktion, die eine solche Hüllkurve für eine gegebene Notenlänge generiert. Benutzen Sie den Funktionskopf

[E] = envel(relDuration,fullDuration,fs)

Finden Sie sinnvolle Parameter für die ADSR-Kurve (Hinweis: Passen Sie die Länge von S an die Länge des Tons an). Modifizieren Sie Ihre Funktion note so, dass die Hüllkurve mit dem generierten Signal punktweise multipliziert wird.

e) Schreiben Sie das Skript AufgabeE.m, welches das Musikstück „Für Elise “von Beethoven aus Abbildung 4 abspielt. Dazu muss zunächst für jede Melodielinie ein separater Signalvektor erzeugt werden. Die beiden Stimmen können dann durch Vektoraddition kombiniert werden. Achten Sie dabei auf Synchronität der beiden Melodielinien, indem für vorgegebene Pausen entsprechende Nullen in den Signalvektoren eingefügt werden.

Abbildung 4: Auszug aus Beethovens „Für Eli"


Mein Problem ist nun, dass mein Skript keine Töne abspielt, die auch nur ähnlich zu denen eines Pianos sind.

sound(createWaveform(440,8000,2,5));

sound(createWaveform(1000,8000,2,5));


sound(note(40,2,2,8000));
sound(note(42,2,2,8000));
sound(note(44,2,2,8000));
sound(note(45,2,2,8000));
sound(note(47,2,2,8000));
sound(note(49,2,2,8000));
sound(note(51,2,2,8000));
sound(note(49,2,2,8000));
sound(note(47,2,2,8000));
sound(note(45,2,2,8000));
sound(note(44,2,2,8000));
sound(note(42,2,2,8000));
disp(note(40,2,2,8000));


function [sinusoid] = createWaveform(frequency,fs,duration,A)
    n = linspace(0,duration-1/fs,duration*fs);
    [sinusoid] = A*cos(2*pi*frequency*n*(1/fs)+(2*pi).*rand(1,1));
end

%12. Wurzel von 2 * Diff + wenn größer als Grundton
%12. Wurzel von 2 * Diff - wenn kleiner als Grundton
%nthroot(x,n)
function [tone] = note(keynum,relDuration,fullDuration,fs)
  basetone = 440;
  frequency = basetone * nthroot(2,12)^(keynum-49);
[tone]=createWaveform(frequency,fs,relDuration*fullDuration,1);
end

Das ganze hört sich an wie verzerrte Signale, die sich egal auf welcher Frequenz, alle gleich anhören.

Woran könnte es liegen und wo liegt mein Fehler?

Avatar von

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community