Subato

Resource Files

Audio Verarbeitung

Studieren Sie das Aufgaben-Papier zur Audio-Verarbeitung lösen Sie die dort enthaltenen Aufgaben.

Nur wenige automatisierte Tests existieren für diese Aufgabe. Die meisten Lösungen der Aufgaben können Sie akustisch überprüfen oder graphisch.


> module Audio where > import Codec.Wav > import Codec.ByteString.Parser > import Data.Audio > import Data.Int > import Data.Array.Unboxed > import Data.Complex > import Data.List > import Data.ByteString.Lazy(readFile) > kammertonA > = [ (10000*sin (2*440*pi*x/44100)) |x<-[0..10*44100-1]] array :: (Ix i, IArray a e) => (i, i) -> [(i, e)] -> a i e > mkAudio:: (RealFrac a1) => [a1] -> Audio Int16 > mkAudio xs > = (Audio 44100 1.array (0,length xs-1).zip [0..].map round) xs > writeWav fn ds = exportFile fn (mkAudio ds) > w1 = writeWav "kammertonA.wav" kammertonA > kammertonA2 = > [ 10000*sin (2*440*pi*x/44100) > + 5000*sin (2*880*pi*x/44100) > | x<-[0..10*44100-1]] > w2 = writeWav "kammertonA2.wav" kammertonA2 > pluggedTime :: (Enum t, Floating t) => t -> t -> [t] > pluggedTime t wv = [] > pluggedH = pluggedTime (44100/2) > plugged = pluggedTime 44100 > pluggedD = pluggedTime (2*44100) > kammertonAHarmonics = plugged 110 > w3 = writeWav "pluggedA.wav" kammertonAHarmonics > a = 440 > b = 493.88 > cs= 554.37 > d = 587.33 > e = 659.25 > fs= 739.99 > gs= 830.61 > aa= 880.00 > scale = [] > w4 = writeWav "scale.wav" scale > maj7 = [] > w5 = writeWav "maj7.wav" maj7 > getWavFromFile fn = do > bs <- Data.ByteString.Lazy.readFile fn > let (Right (Audio _ _ adat)) > = runParser (parseWav::Parser (Audio Int16)) bs > return (elems adat) > toPgfplot ws = "" > writeForLaTeX resultFileName ws = do > ws <- getWavFromFile "einTon.wav" > let start = "\\begin{tikzpicture}\n\ > \\\begin{axis}\n\ > \[axis lines = left,xlabel = $Sekunde$,ylabel = {Samples},]\n\ > \\\addplot[color=blue,mark=dot,]\n\ > \\\coordinates {\n" > let end= "};\n\ > \\\end{axis}\n\ > \\\end{tikzpicture}" > writeFile resultFileName (start++((toPgfplot$take 441 ws)++end)) > dft :: RealFloat a => [Complex a] -> [Complex a] > dft _ = [] Sie werden zwischen unterschiedlichen numerischen Typen konvertieren müssen. Das stellt wahrscheinlich die Hauptschwierigkeit dieser Aufgabe dar. Hierzu wird die Funktion {\tt fromIntegral} das Mittel der Wahl sein. Denken Sie auch daran, dass der Indexzugriff auf Listen mit dem Operator {\tt !!} implementiert ist. > analyseFileStart fn = do > ws <- getWavFromFile fn > return > $zip [0,10..] > $map (realPart.abs) > $take 200 > $dft > $map (\x -> 0.0:+fromIntegral x*1.0) > $take 4410 ws
lhs
You are not logged in and therefore you cannot submit a solution.