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