S-89.820 Äänenkäsittelyn jatko-opintokurssi Erikoistyö, 24.6.2004.



Samankaltaiset tiedostot
MUSIIKKIÄÄNITTEIDEN PATINOINTI SIGNAALINKÄSITTELYN AVULLA. Vesa Välimäki (1), Sira González (1), Jukka Parviainen (2) ja Ossi Kimmelma (3)

TL5503 DSK, laboraatiot (1.5 op) Suodatus 2 (ver 1.0) Jyrki Laitinen

Mono- ja stereoääni Stereoääni

Laskuharjoitus 2 ( ): Tehtävien vastauksia

Matlab-tietokoneharjoitus

Marantz PMD661. Äänittäminen

Åbo Akademi klo Mietta Lennes Nykykielten laitos Helsingin yliopisto

TL5503 DSK, laboraatiot (1.5 op) Suodatus 1 (ver 1.0) Jyrki Laitinen

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

T DSP (Harjoitustyö 2003, v. 5.01) Sivu 2 / 9

Lue ohjeet huolellisesti ennen laitteen käyttöä.

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

SGN-1200 Signaalinkäsittelyn menetelmät Välikoe

Alipäästösuotimen muuntaminen muiksi perussuotimiksi

Digitaalinen audio

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Cubase perusteet pähkinänkuoressa. Mikä Cubase on? Projektin aloitus

ELOKUVATYÖKALUN KÄYTTÖ ANIMAATION LEIKKAAMISESSA. Kun aloitetaan uusi projekti, on se ensimmäisenä syytä tallentaa.

Suodattimet. Suodatintyypit: Bessel Chebyshev Elliptinen Butterworth. Suodattimet samalla asteluvulla (amplitudivaste)

Harjoitus 1: Matlab. Harjoitus 1: Matlab. Mat Sovelletun matematiikan tietokonetyöt 1. Syksy 2006

SGN-1251 Signaalinkäsittelyn sovellukset Välikoe Heikki Huttunen

LP-levyn digitointi Audacity-ohjelmalla

S Laskennallinen Neurotiede

Laskuharjoitus 4 ( ): Tehtävien vastauksia

C-kasetin digitointi Audacity-ohjelmalla

SGN-1200 Signaalinkäsittelyn menetelmät Välikoe

Zeon PDF Driver Trial

1 Olkoon suodattimen vaatimusmäärittely seuraava:

M2A Suomenkielinen käyttöohje.

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

Tieteellinen laskenta 2 Törmäykset

Juha Henriksson. Digitaalinen äänentallennus Dr. Juha Henriksson Finnish Jazz & Pop Archive

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

Mediaanisuodattimet. Tähän asti käsitellyt suodattimet ovat olleet lineaarisia. Niille on tyypillistä, että. niiden ominaisuudet tunnetaan hyvin

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

KOHINA LÄMPÖKOHINA VIRTAKOHINA. N = Noise ( Kohina )

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Audacity moniste

MINI-DISK. 1. MINI-DISK levykkeen asentaminen levyke-asemaan

Organization of (Simultaneous) Spectral Components

Signaalien datamuunnokset. Digitaalitekniikan edut

Signaalien datamuunnokset

AV-muotojen migraatiotyöpaja - ääni. KDK-pitkäaikaissäilytys seminaari / Juha Lehtonen

Audacity-äänenkäsittelyohjelman pikakäyttöohje

Moottorin kierrosnopeus Tämän harjoituksen jälkeen:

C-kasetin digitointi Audacity-ohjelmalla

Tässä dokumentissa on ensimmäisten harjoitusten malliratkaisut MATLABskripteinä. Voit kokeilla itse niiden ajamista ja toimintaa MATLABissa.

SGN Signaalinkäsittelyn perusteet Välikoe Heikki Huttunen

THE audio feature: MFCC. Mel Frequency Cepstral Coefficients

M2A Suomenkielinen käyttöohje.

Ohjelmoinnin perusteet Y Python

LABORATORIOTYÖ 2 A/D-MUUNNOS

TL5503 DSK, laboraatiot (1.5 op) Audiosignaalit (ver 1.0) Jyrki Laitinen

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

Puheenkoodaus. Olivatpa kerran iloiset serkukset. PCM, DPCM ja ADPCM

S Laskennallinen Neurotiede

Ohjelmoinnin perusteet Y Python

Äänitiedostoista. 1 Äänen tallentaminen

LP-levyn digitointi Audacity-ohjelmalla

SGN Signaalinkäsittelyn perusteet Välikoe Heikki Huttunen

LABORATORIOTYÖ 2 A/D-MUUNNOS

Virheen kasautumislaki

Harjoitustyö 1. Signaaliprosessorit Sivu 1 / 11 Vähämartti Pasi & Pihlainen Tommi. Kaistanestosuodin, estä 2 khz. Amplitudi. 2 khz.

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

Luento 8. Suodattimien käyttötarkoitus

LP-levyn digitointi Audacity-ohjelmalla

Mekaniikan jatkokurssi Fys102

SGN-1200 Signaalinkäsittelyn menetelmät, Tentti

Matlabin perusteita Grafiikka

20 Kollektorivirta kun V 1 = 15V Transistorin virtavahvistus Transistorin ominaiskayrasto Toimintasuora ja -piste 10

z 1+i (a) f (z) = 3z 4 5z 3 + 2z (b) f (z) = z 4z + 1 f (z) = 12z 3 15z 2 + 2

SONY MZ-N707 MiniDisc-tallennin

Elektroniikka, kierros 3

Pörisevä tietokone. morsetusta äänikortilla ja mikrofonilla

Tutustu Daisy-soittimeen!

SMG-1100: PIIRIANALYYSI I. Verkkojen taajuusriippuvuus: suo(dat)timet

Kokonaislukuaritmetiikka vs. logiikkaluupit

3 Ikkunointi. Kuvio 1: Signaalin ikkunointi.

Dynamiikan hallinta Lähde: Zölzer. Digital audio signal processing. Wiley & Sons, Zölzer (ed.) DAFX Digital Audio Effects. Wiley & Sons, 2002.

Kuuloaisti. Korva ja ääni. Melu

Suomenkielinen käyttöohje

SONY MZ-R700 MiniDisc-tallennin

Kuulohavainnon perusteet

U-REMIX USB RF 2 RF 1 POWER

SGN-4200 Digitaalinen audio

Johdanto tieto- viestintäteknologian käyttöön: Äänitystekniikka. Vfo135 ja Vfp124 Martti Vainio

Tiistai klo Jari Eerola

Toinen harjoitustyö. ASCII-grafiikkaa

Avokelanauhan digitointi Audacity-ohjelmalla

Tietorakenteet ja algoritmit - syksy

Antenni Käytä FM-antennia parhaiden mahdollisten vastaanotto-olosuhteiden saavuttamiseksi.

Äänen eteneminen ja heijastuminen

TAMPEREEN TEKNILLINEN YLIOPISTO

Ohjelmoinnin perusteet Y Python

LABORATORIOTYÖ 3 VAIHELUKITTU VAHVISTIN

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Tiedonkeruu ja analysointi

Suomenkielinen käyttöohje

ELEC-C Sovellettu digitaalinen signaalinkäsittely. Äänisignaalien näytteenotto ja kvantisointi Dither Oskillaattorit Digitaalinen suodatus

Transkriptio:

S-89.820 Äänenkäsittelyn jatko-opintokurssi Erikoistyö, 24.6.2004. Opiskelija #1 Nimi Opiskelijanumero Sähköposti Koulutusohjelma ja vsk Opiskelija #2 Nimi Opiskelijanumero Sähköposti Koulutusohjelma ja vsk Kimmelma, Ossi 46775U Ossi.Kimmelma@hut.fi S N Parviainen, Jukka 40389S parvi@hut.fi T N

.

Äänen huonontaminen digitaalisesti Ossi Kimmelma ja Jukka Parviainen ossi.kimmelma@hut.fi, parvi@cis.hut.fi 24. kesäkuuta 2004

2 SISÄLTÖ Sisältö 1 Johdanto 4 1.1 Ääni luonnossa ja tallenteena.................. 4 1.2 Äänitteiden historiasta...................... 5 1.2.1 Akustinen tallennus 1877-1925.............. 5 1.2.2 Savikiekot 1925-1950................... 6 1.2.3 LP-levyt ja nauhat 1950-1982.............. 7 1.2.4 Digitaalitekniikka 1982-................. 8 1.3 Matlab-ohjelmisto......................... 8 1.3.1 Yleistä toteutuksesta................... 9 2 Äänen huonontamisen efektejä 10 2.1 Särö................................ 10 2.2 Suodatus.............................. 11 2.3 Kohina............................... 12 2.4 Levyn vääristymät ja huojunta................. 13 2.5 Naarmut ja paikoilleen jääminen................. 13 2.6 Ritinä ja rahina.......................... 13 2.7 Mono................................ 13 2.8 Dynamiikka............................ 14 3 Tuloksia 15 3.1 Huononnusfunktiot........................ 15 3.2 Testiaineisto............................ 15 3.3 Esimerkkejä huononnuksista................... 15 3.3.1 Savikiekko 1940 - ajo1.m................. 15 3.3.2 Vinyylilevy 1967 - ajo2.m................ 16 3.3.3 Fonografi 1896 - ajo3.m................. 17 3.3.4 CD-levy 1995 - ajo4.m.................. 17 3.3.5 MP3-tiedosto 2004.................... 17 3.3.6 Yhteenveto........................ 18

SISÄLTÖ 3 4 Pohdinta 19 A Matlab-funktiot 20 A.1 Matlab-funktio analysoikaistat.m................ 20 A.2 Matlab-funktio huojunta.m.................... 22 A.3 Matlab-funktio hyppy.m..................... 25 A.4 Matlab-funktio kampa.m..................... 27 A.5 Matlab-funktio kartiotorvi.m................... 29 A.6 Matlab-funktio kohina.m..................... 32 A.7 Matlab-funktio kvtasot.m.................... 32 A.8 Matlab-funktio lue.m....................... 34 A.9 Matlab-funktio mono.m..................... 37 A.10 Matlab-funktio naarmujakso.m................. 37 A.11 Matlab-funktio rahinavalmis.m.................. 40 A.12 Matlab-funktio ritinagener.m................... 42 A.13 Matlab-funktio saroatan.m.................... 44 A.14 Matlab-funktio saro.m...................... 44 A.15 Matlab-funktio suodata.m.................... 45 B Esimerkkien ajotiedostot 48 B.1 Esimerkki 1: Savikiekko..................... 48 B.1.1 Ajotiedosto ajo1.m.................... 48 B.1.2 Tulostustiedosto ajo1.log................. 49 B.2 Esimerkki 2: Vinyylilevy..................... 50 B.2.1 Ajotiedosto ajo2.m.................... 50 B.2.2 Tulostustiedosto ajo2.log................. 51 B.3 Esimerkki 3: Fonografi - puhetta................. 53 B.3.1 Ajotiedosto ajo3.m.................... 53 B.3.2 Tulostustiedosto ajo3.log................. 54 B.4 Esimerkki 4: CD-levy....................... 55 B.4.1 Ajotiedosto ajo4.m.................... 55 B.4.2 Tulostustiedosto ajo4.log................. 55

4 1 JOHDANTO 1 Johdanto Digitaalitekniikka mahdollistaa vanhojen äänitteiden laadun parantamisen. Vanhoissa levyissä ilmenevää rahinaa voidaan poistaa ja teos tallettaa digitaalisessa muodossa. Tässä työssä paneudutaan vastakkaiseen tehtävään eli äänen tahalliseen huonontamiseen. Tavoitteena on saada nykyajan äänite (hi-fi, high fidelity) kuulostamaan vanhalta (lo-fi, low fidelity). Äänenlaadun huonontaminen vaatii ymmärrystä, miten musiikkia tai puhetta on tallennettu aina 1800-luvun lopusta lähtien. Yleisen ääneen liittyvän perusteoksen [GMS00] lisäksi äänitteiden historiasta on runsaasti materiaalia niin kirjoina [GS90] kuin Internetissä [Sch04]. Tiedon pohjalta on tehty joukko tietokoneohjelmia, joilla voidaan tahallisesti matkia erilaisia vanhoja äänitetyyppejä ja niissä esiintyviä virheitä. Ohjelmointiympäristönä on toiminut Matlab 1. Seuraavaksi kerrataan hieman äänitteiden historiaa sekä äänitallenteisiin liittyviä piirteitä. Luvussa 2 esitellään taustoja erilaisille huononnusefekteille. Luvussa 3.1 esitellään tätä työtä varten kirjoitetut funktiot ja niillä saatuja esimerkkejä esitellään luvussa 3.3. Liitteenä on ohjelmakoodi, joka on myös saatavilla Internetistä sivulta http://www.cis.hut.fi/parvi/heureka/. 1.1 Ääni luonnossa ja tallenteena Ihmisen tuottama puhe tai kuulema ääni on ilmamolekyylien värähtelyä eli ilmanpaineen muutoksia, joita matemaattisesti esitetään signaaleina. Äänitteiden osalta voidaan ajatella tarvittavan äänityslaitteiston, äänitemedian ja äänentoistojärjestelmän. Kuvassa 1 on hahmoteltu tilanne, jossa ihmisen ääntä tallennetaan mikrofonilla vaikkapa tietokoneen kautta CD-levylle, joka myöhemmin soitetaan kotistereoista. Äänenlaadun kannalta kussakin vaiheessa voi tapahtua huonontumista. Media, vaikkapa vinyylinen LP-levy, kuluu käytössä, kerää pölyä ja voi naarmuuntua. Mikrofonit, vahvistimet ja kaiuttimet saattavat taasen olla kykenemättömiä tallettamaan tai toistamaan ääntä halutulla tavalla. Äänitteen laatuun vaikuttaa myös, minkä tyyppistä ääni on. Puheääni on varsin kapeakaistaista ja siinä on runsaasti taukoja, jotka helpottavat mahdollisten virheiden korjaamista. Orkesterimusiikissa äänisignaali koostuu useista eri lähteistä, jolloin taltioitu äänite menettää paljon tilavaikutelmasta. 1 MathWorks Inc., http://www.mathworks.com/

1.2 Äänitteiden historiasta 5 ÄÄNITYS MEDIA TOISTO Kuva 1: Äänittäminen esimerkiksi levylle, joka voidaan tallettaa tai siirtää ja kuunnella äänentoistojärjestelmän kautta. 1.2 Äänitteiden historiasta Ääniteteollisuudessa on vaikuttanut taloudellis-tekninen kilpailu, jossa toiset tekniset ratkaisut ovat unohtuneet kalliin hinnan tai väärän ajoituksen takia. Historiasta voidaan löytää erilaisia kehityslinjoja, joista muutamia seurataan seuraavaksi. Kunkin luvun lopussa on listattu muutamia aikakauden tyypillisiä piirteitä, joita hyväksikäyttämällä työn kokeellisessa osassa (luku 3.3) huononnetaan nykyäänitteen äänenlaatua vastaamaan kyseistä aikakautta. 1.2.1 Akustinen tallennus 1877-1925 Amerikkalainen Thomas Alva Edison toteutti vuonna 1877 ensimmäisen ihmisen ääntä tallentavan ja toistavan laitteen. Hänen kehittämänsä fonografi, kuten kuvassa 2 etualalla, käytti sylinterimäistä tallennusvälinettä. Emil Berliner kehitti litteitä levyjä käyttävän gramofonin 1880-luvulla, josta esimerkki kuvan 2 taka-alalla. Gramofonit syrjäyttivät fonografit viimeistään 1910-luvulla vaikka fonografeja käytettiin sanelulaitteina vielä 1950-luvulla. Aluksi rakennettiin täysin mekaanisia laitteita, joiden tärkeimmät osat olivat jousimoottorikoneisto, neula ja äänirasia (kuva 3) sekä ääntä vahvistava torvi. Äänitystilanne poikkesi suuresti nykyisestä: koko orkesteri artistia myöten oli samassa pienessä tilassa ja laulusolisti huusi ääntä kokoavaan torveen. Äänitystä ei voinut korjata jälkikäteen ja ennen kopiointitekniikoita jokainen äänite oli ainutkertainen. Silti äänitteet loivat uusia suuria sankareita kuten oopperalauluja Enrico Caruson. Alkuajan akustisille äänityksille oli tyypillistä siis hyvin kapea taajuuskaista ja heikko laatu. Kierrosnopeuskin saattoi vaihdella levystä toiseen.

6 1 JOHDANTO Kuva 2: Edessä Edisonin fonografi 1890-luvulta, jossa ääni on talletettu vahasylinterille. Takana gramofoni 1910-luvulta, joka käyttää levyjä. Molemmissa ääni vahvistetaan isolla torvella. Näiden laitteiden suuruusluokan näkee vertaamalla niitä soittimien välissä pöydällä olevaan A4-kokoiseen monisteeseen. Laitteet ovat Helsingin yliopiston Musiikkikirjaston kokoelmissa ja täysin toimintakuntoisia. 1.2.2 Savikiekot 1925-1950 Sähköinen aikakausi alkoi 1920-luvulla, kun käyttöön saatiin mikrofonit ja putkivahvistimet (vacuum tube). Se toi mukanaan äänielokuvan, radion ja television. Levyteollisuus eli suhdanteiden mukana ylös ja alas. Gramofonien savikiekkolevyjen ( shellac ) pyörimisnopeudeksi vakiintui 78 kierrosta minuutissa (78 rpm) ja yhdelle puolelle mahtui noin 3 minuuttia musiikkia. Kaista oli edelleen rajoitettu noin 3 khz:iin.

1.2 Äänitteiden historiasta 7 Kuva 3: Yksityiskohtia gramofonista: vasemmalla jousimoottori kannen alla. Ison jousipakan vasemmalla puolella vakauttimet, joilla kierrosnopeus saadaan pysymään vakiona 78 kierrosta minuutissa. Yhdellä vedolla saattaa kuunnella noin kahdeksan levyä ( savikiekkoa ). Oikealla äänirasia, jonka neula vaihdettiin jokaisen kuuntelukerran jälkeen. Jykevämmällä neulalla saatiin voimakkaampi ääni. 1.2.3 LP-levyt ja nauhat 1950-1982 Ääninauha oli keksitty jo 1900-luvun alussa, mutta laajaan käyttöön se tuli vasta maailmansotien jälkeen. Nauhat mahdollistivat äänitteiden editoinnin jälkikäteen. Nauha tuli kotikäyttöön 1950-luvulla avokelanauhureissa ja myöhemmin 1960-luvulla C-kaseteissa. Levyjen pelastukseksi tulivat vinyyliset LP-levyt (long play), joihin mahtui moninkertainen määrä musiikkia kuin savikiekoille. LP-levyjen kierrosnopeudeksi tuli 33 rpm ja single-levyille 45 rpm. Stereoäänitys ja -toisto tulivat myös mahdollisiksi, mikä mahdollisti jo paremman tilavaikutelman. Moniraitanauhoitukset vapauttivat artistit ja orkesterit hiomaan tuotoksiaan erikseen. Amerikkalainen izotope, Inc, on tehnyt ohjelman 2 3, joka matkii levyjä soitettaessa ilmeneviä virheitä. Ohjelma on saatavissa WinAmp-ohjelman lisä- 2 http://www.izotope.com/products/audio/vinyl/ 3 WinAmp 5 plug-in: http://www.izotope.com/products/audio/media/

8 1 JOHDANTO osaksi ja sen käyttöliittymä on kuvassa 4. Taulukkoon 1 on kerätty säädettävien parametrien piirteet. Kuva 4: izotope Vinyl -äänenhuononnusohjelma. 1.2.4 Digitaalitekniikka 1982- Digitaalitekniikka on monipuolistanut äänitys- ja äänentoistotekniikkaa. Tämän päivän kotiteatterijärjestelmillä pyritään saamaan aikaan autenttinen äänimaailma. Ääntä siirretään digitaalisessa muodossa niin CD-levyillä (Compact Disc), joka esiteltiin vuonna 1982, kuin vaikkapa kännyköiden välillä. Tietokoneiden ja Internetin kehitys on lisännyt erilaisten digitaalisten laitteiden ja sovellusten määrää myös äänitetekniikassa. Fyysiset levyt ovat yhä edelleen mahdollisia vioittua tai likaantua. Laitteistojen ja tekniikoiden elinikä on lyhentynyt, eikä esimerkiksi kotikoneelle poltettujen CD-romppujen säilyvyydestä ole todisteita. 1.3 Matlab-ohjelmisto Matlab on MathWorks Inc. tekemä teknisen laskennan ohjelmisto, joka on laajassa käytössä niin teollisuudessa kuin yliopistomaailmassa. Matlab sisältää valmiit funktiot (ohjelmat) äänitiedostojen lukemiseen, käsittelyyn ja kirjoittamiseen sekä sillä on helppoa tehdä omia funktioita jatkokäsittelyyn.

1.3 Matlab-ohjelmisto 9 Parametri Selitys Mekaaninen kohina Levysoittimen moottorin jyrinä ja melu Sähköinen kohina Sähköisten osien tuottama kohina, kuten 50 Hertzin verkkohumina Kuluma Levyn kuluneisuuden säätö, upouudesta useita tuhansia kertoja soitettuun Pöly Pölyn määrä levyn pinnalla Naarmut Naarmujen määrä ja syvyys levyssä Vääntyminen Levyn vääntyminen ja vääntymismuoto Levysoittimen vuosimallking ) Vuosimalli alkaen nykyisistä ( linear trac- aina 1930-luvun gramofoneihin Stereo/Mono Vaihtaa stereo- ja monoulostulon välillä Taulukko 1: Parametreja, joilla voi kuvailla (vinyyli)levyn äänenlaadun huonontamista. Lähde: izotope, Inc. Tässä työssä olevat funktiot on koottu Matlabin tapaan työkalupakiksi (toolbox). Ohjelmatiedostot ovat luettavissa millä tahansa tekstinkäsittelyohjelmalla. Matlab tulkkaa ohjelmakoodia rivi riviltä eteenpäin. Funktioista saa tietoa kirjoittamalla Matlabin työtilaan help funktionnimi. 1.3.1 Yleistä toteutuksesta Lähes tulkoon jokaiselle huononnuspaketin funktiolle annetaan syötteenä sisääntuleva signaali y ja käytetty näytteenottotaajuus fs. Funktio palauttaa ainakin käsittelyn signaalin yout. Funktiot toimivat sekä yksi- (mono) että kaksikaistaiselle (stereo) äänelle. Äänitiedostot kannattaa sijoittaa vaikkapa alihakemistoon wavin ja muokatut äänet kirjoitetaan alihakemistoon wavout käyttäen näytteenottotaajuutta 44100 Hz ja 16 bittiä näytettä kohti. Matlabin luku- ja kirjoitusoperaatiot WAV-tyyppiselle tiedostolle ovat wavread ja wavwrite. Näytteenottotaajuutta voi Matlabissa muuttaa suhteella p/q komennolla resample(x, p, q). Ohjelmat voivat hyytyä, jos äänitiedosto on pitkä eli useita minuutteja. Kannattaa aloittaa lyhyellä näytteellä ja testata ajankulusta. Työtilaan voi asettaa globaalin muuttujan global VAROT ja antaa sille arvon 1-10. Suurin arvo antaa paljon tietoja ruudulle funktion kuluttamasta ajasta; arvo VAROT = 3 riittää antamaan perustiedot.

10 2 ÄÄNEN HUONONTAMISEN EFEKTEJÄ 2 Äänen huonontamisen efektejä Tässä luvussa esitellään yksittäisiä piirteitä äänenlaadun huonontamiseen ja seuraavassa luvussa niillä aikaansaatuja esimerkkejä. Yksittäisistä komponenteista (taulukko 2 sivulla 16) voidaan rakentaa eri asetuksilla äänenhuononnusketju, jonka lopputuloksena voidaan jäljitellä jonkun aikakauden äänitettä. Huononnusketjun tulee ottaa huomioon niin kuvitteellinen äänitystilanne, äänitemediassa itsessään olevat tai ajan mukana syntyvät viat ja äänentoiston olosuhteet. 2.1 Särö Säröä syntyy äänentoistoketjussa, kun jokin ketjun komponenteista ei ole lineaarinen. Epälineaarisuus voi olla seurausta komponentin yleisestä epälinaarisuudesta tai vääränlaisista signaalin tasoista. Tyypillistä on, että komponentti vahvistusketjussa ei pysty toistamaan signaalia lineaarisesti, jos sisään tuleva signaali on liian vahva. Tämän seurauksena signaali leikkautuu. Tätä leikkautumista on mallinnettu arkustangentti-funktiolla. Käytetty arkustangentti on muotoa y = (2T/π) arctan(k x). (1) Argumenteilla k ja T voi säätää funktion lineaarisen osan nousunopeutta sekä säröytymistasoa. Säröyttämisfunktio vakioilla T on 1 ja k on 3 on esitetty kuvassa 5(a). 0.9 Säröyttävä arkustangentti funktio Saro funktio signaali ulos 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 0 0.2 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8 2 signaali sisään Ulostuleva signaali 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1 0.8 0.6 0.4 0.2 0 0.2 0.4 0.6 0.8 1 Sisääntuleva signaali Kuva 5: (a) Säröyttämisfunktio arkustangentti. (b) Tiukasti saturoituva funktio.

2.2 Suodatus 11 Toinen leikkaantumista mallintava funktio on saro. Se mallintaa tiukkaa leikkaantumista ja saturoi signaalin argumenttina annettavalle tasolle. Ulostuleva signaali sisääntulevan signaalin funktiona on kuvassa 5(b). 2.2 Suodatus Ihminen aistii ääniä 20 Hz ja 20 khz välillä. Näin suureen taajuuskaistaan eivät monet äänentoiston komponentit kuitenkaan yllä. Kirjallisuudessa ilmoitettu arvo savikiekon toistolle on 200 Hz - 3 khz ja vinyylille 30 Hz - 15 khz [MV01]. Savikiekon toisto on yleensä huomattavan värittynyt varsinkin alapäästä gramofoneissa käytetyn kartioputken takia. Teoreettisesti äärellisen kartioputken taajuusvaste voidaan johtaa Salmon torven erillistapauksena ja sen admittanssi taajuuden funktiona saadaan lausekkeesta [Bac01]: Y a = S 0 ρc ( coth [ 1 2 (ka)2 + ikl e ] i 1 kx 0 ), (2) jossa x 0 on etäisyys torven kurkusta torven pintojen jatkeiden muodostaman kartion keskipisteeseen, l e torven efektiivinen pituus, c äänen nopeus väliaineessa, S 0 pinta-ala torven kurkussa, k aaltoluku, ρ ilman tiheys ja a torven suun säde torven suulla. Torven impedanssifunktion (Z = Y 1 ) reaali- ja imaginääriosat on piirretty kuvaan 6(a) arvoilla x 0 on 7 cm, l e on 0.4 m, c on 340 m/s ja a on 0.3 m. Akustinen impedanssi näkyy suoraan taajuusvastees- 0 Äärellisen kartioputken impedanssivaste 6dB Suotimen taajuusvaste 3dB 0 3dB 6dB 3dB 10dB 6dB Amplitudi 20dB 10dB 30dB 20dB 30dB 0 1000 2000 3000 4000 5000 6000 taajuus 0 1000 2000 3000 4000 5000 6000 Taajuus Kuva 6: (a) Kartiotorven reaaliosa (jatkuva) ja imaginääriosa (viivoitettu). (b) Ideaalisen vasteen pohjalta tehdyn digitaalisen suotimen taajuusvaste. sa. Jos tilavuusnopeuslähde oletetaan vakioksi, saadaan äänenpaine suoraan akustisen säteilyimpedanssin ja tilavuusnopeuden tulona. Tämä vaste toimi

12 2 ÄÄNEN HUONONTAMISEN EFEKTEJÄ suunnittelun pohjana tehtäessä digitaalista suodinta. Suotimen taajuusvaste on esitetty kuvassa 6(b). Funktiolla suodata tehtävän taajuuskaistan rajauksen esimerkkivaste kaistalla 200 Hz - 3 khz (vinyylilevyn kaista) on esitetty kuvassa 7. Stabiiliuden varmistamiseksi suotimet on toteutettu digitaalisilla FIR-suotimilla. Suotimen taajuusvaste 0 Amplitudi 3dB 6dB 10dB 100 500 1k 5k 10k Taajuus Suotimen taajuusvaste 0 Amplitudi 3dB 6dB 10dB 100 500 1k 5k 10k Taajuus Kuva 7: Kaistanrajoitukseen käytetyn suotimen taajuusvaste. Rajataajuudet 200 Hz ja 3 khz. 2.3 Kohina Eri äänitteiden signaali-kohinataso vaihtelee huomattavasti. Funktio kohina lisää signaaliin valkoista kohinaa. Valkoinen kohina on kohinaa, jonka spektri on tasainen koko taajuuskaistalla. Kohinaa voi muokata myös haluamakseen. On kuitenkin huomattava, että kohinan lisäämisen jälkeen yleensä tapahtuu jonkinlainen suodatus, joten kuultavassa lopputuloksessa kohina on kuitenkin suodatettu. Funktiolle kohina annetaan argumenttina dynaaminen alue, joka on suurimman mahdollisen signaalin tason ja kohinatason suhde. Savikiekoilla dynaaminen alue on 18 db ja vinyylille 65 db [MV01]. On myös huomattava, että lisättäessä rahinaa, joka on nauhoitettu, tulee mukana myös kohinaa.

2.4 Levyn vääristymät ja huojunta 13 2.4 Levyn vääristymät ja huojunta Huojunnalla tarkoitetaan tässä jaksollista käytöstä, jossa taajuudet vaihtelevat. Lähteenä voi olla levy, jossa reikä ei ole keskellä vaan hieman sivussa tai levy on muuten vääntynyt, jolloin neula ei kulje täysin ympyrärataa. Toteutuksessa käytetään levyn kierrosnopeutta, läpimittaa r ja poikkeamaa keskipisteestä a, joiden geometriaan perustuen lasketaan neulan lukuvauhti eri puolella kierrosta. Huojunta on hyvin selkeästi aistittavissa. Huojuntaa voi ilmetä myös nauhoissa (jitter), jolloin se on nopeampitaajuista. 2.5 Naarmut ja paikoilleen jääminen Naarmut levyn pinnassa tuottavat jaksollisen lyhytkestoisen virheen. Naarmun kohdalla luku-ura katkeaa ja lukuvarsi saattaa jäädä pompun jälkeen lyhyeksi ajaksi värähtelemään. Naarmun suuruus vaikuttaa pompun pituuteen ja voimakkuuteen. Pahimmassa tapauksessa naarmu on sellainen, että neula hyppää uudestaan samalle uralle eli jää jumiin. Tämä on toteutettu funktiossa hyppy. 2.6 Ritinä ja rahina Rahina on naarmuja satunnaisempi, mutta ritinää voimakkaampi ääni, joka usein on syntynyt kulutuksesta. Toteutuksessa rahinavalmis käytetään eräältä LP-levyltä nauhoitettua autenttista rahinaa. Omia rahinamalleja voi myös käyttää. Levyn pintaan tarttuu kiinni pölyä ja muita pieniä partikkeleita, jotka ovat jakautuneet varsin tasaisesti koko levylle. Ritinää on mallinnettu pienillä satunnaisilla vaihteluilla, joiden määrää voidaan säätää. 2.7 Mono Usein käsiteltävät näytteet ovat kaksikanavaisia. Niiden muunto yhteen kanavaan voidaan suorittaa käyttäen funktiota mono. Esimerkkeinä monoäänitteistä Edison-lieriö sekä savikiekko. Muunnos stereosta monoon on toteutettu keskiarvoistamalla stereosignaali kahdesta kanavasta yhteen kanavaan.

14 2 ÄÄNEN HUONONTAMISEN EFEKTEJÄ 2.8 Dynamiikka Vanhoissa äänitteissä hiljaiset äänet voivat kadota kuulumattomiin. Tätä voi mallintaa vähentämällä digitaalisen signaalin kvantisointitasoja. Funktio kvtasot mahdollistaa niin lineaarisen kuin vapaavalintaisen tasojen muokkaamisen. Tasojen vähentäminen johtaa yhtälailla myös kohinaan. Jotkut häiriöt voivat aiheuttaa poikkeuksellisen suuria näytearvoja signaaliin. Jos arvot skaalataan maksimin suhteen, oikea data heikkenee ja kohina lisääntyy.

15 3 Tuloksia 3.1 Huononnusfunktiot Taulukossa 2 on esitelty työssä tehdyt funktiot. Ensimmäisessä sarakkeessa on viittaus liitekappaleeseen, josta tiedosto löytyy tässä dokumentissa. Huomaa, että uusin versio löytyy Internetistä http://www.cis.hut.fi/parvi/ Heureka. Toisessa sarakkeessa on funktion tiedostonimi; Matlabissa funktiota kutsutaan samalla nimellä mutta ilman päätettä.m. Jos funktiota on käytetty esimerkeissä, viitataan kyseiseen kappaleeseen. Viimeisessä sarakkeessa on lyhyt selite funktion tehtävästä. Tarkempi kuvaus löytyy kunkin tiedoston alusta. 3.2 Testiaineisto Hakemistossa http://www.cis.hut.fi/parvi/heureka/wavin/ on joitakin äänitiedostoja (taulukko 3), joita on käytetty testauksessa. 3.3 Esimerkkejä huononnuksista Jokaista alla olevaa esimerkkiä varten on kirjoitettu pääohjelma (ajox.m, jossa X on numero), joka kutsuu tietyssä järjestyksessä huononnusfunktioita. Pääohjelmat ovat Internetissä hakemistossa http://www.cis.hut.fi/ parvi/heureka/ ja niiden tuottamat äänitiedostot ovat hakemistossa http: //www.cis.hut.fi/parvi/heureka/wavout/. 3.3.1 Savikiekko 1940 - ajo1.m Käsiteltävänä äänitiedostona on wavin/branddream.wav, joka on löytynyt mummon tanhutossujen alta ullakon kirstusta. Savikiekko pyörii 78 kierrosta minuutissa gramofonissa, jossa iso kartiotorvi. Suoritetut toimenpiteet olivat mono, huojunta, kohina (SNR 18 db), suodata (200 Hz - 3 khz), rahinavalmis, naarmujakso, ritinagener ja kartiotorvi. Saatu lopputulos tiedostossa wavout/branddream78rpm.wav. Käytetty äänitiedosto on monipuolisesti miksattu ja siten hankala tapaus tehdä vanhaksi.

16 3 TULOKSIA Liite funktio Esimerkkiluku Selite A.1 analysoikaistat.m taajuuspuolen analysointityökalu A.2 huojunta.m 3.3.1 lisää huojuntaa A.3 hyppy.m 3.3.2, 3.3.3, jättää neulan samalle uralle 3.3.4 A.4 kampa.m voimistaa resonoivia taajuuksia A.5 kartiotorvi.m 3.3.1, 3.3.3 matkii gramofonin torvea A.6 kohina.m 3.3.1, 3.3.2, lisää kohinaa 3.3.3 A.7 kvtasot.m 3.3.3 poistaa kvantisointitasoja / dynamiikkaa A.8 lue.m 3.3.1, 3.3.2, 3.3.3, 3.3.4 lukee ja tarkistaa äänitiedoston A.9 mono.m 3.3.1, 3.3.3 ääni yksikanavaiseksi A.10 naarmujakso.m 3.3.1, 3.3.2, lisää jaksollisen virheen 3.3.3 A.11 rahinavalmis.m 3.3.1, 3.3.2, lisää valmista rahinaa 3.3.3 A.12 ritinagener.m 3.3.1, 3.3.2 lisää pientä ritinää A.13 saroatan.m pehmeä säröfunktio A.14 saro.m saturoiva säröfunktio A.15 suodata.m 3.3.1, 3.3.2, 3.3.3 kaistanpäästösuodatus Taulukko 2: Matlab-funktiot ja missä esimerkeissä niitä on käytetty. 3.3.2 Vinyylilevy 1967 - ajo2.m Sama äänitiedosto kuten edellisessä esimerkissä. Äänitystekniikka on parantunut, käytössä on stereoääni ja kaista lähes riittävä. Levyä on kuitenkin naarmutettu sen verran pahasti, että se jää paikoilleen muutaman kierroksen ajaksi, ennen kuin neulaa tönäistään. Suoritetut toimenpiteet olivat kohina (SNR 65 db), suodata (30 Hz - 15 khz), rahinavalmis, naarmujakso, hyppy ja ritinagener. Saatu lopputulos tiedostossa wavout/branddream33rpm.wav.

3.3 Esimerkkejä huononnuksista 17 Äänitiedosto Kesto Luonnehdinta BrandDream.wav 68,44 s pop, N.N cd02.wav 30,35 s miehen puhetta, Monty Python: Lumberjack gimmela.wav 25,51 s pop, Gimmel vanhoja2.wav 45,57 s jazz, Trio Töykeät: Vanhoja poikia viiksekkäitä Taulukko 3: Testiääniä. 3.3.3 Fonografi 1896 - ajo3.m Internetissä on saatavilla Yhdysvaltain presidenttien puheita 1890-luvulta. Tällä kertaa presidentillä on muita urahaaveita. Syötteenä wavin/cd02.wav ja toimenpiteet mono, kohina (SNR 13 db), suodata (400 Hz - 1600 Hz), rahinavalmis, kvtasot, naarmujakso ja kartiotorvi. Lopputulos on tiedostossa wavout/cd02fono.wav. 3.3.4 CD-levy 1995 - ajo4.m Hyväkin levy kärsii ajan myötä. CD:ssä lineaarinen lukunopeus on 1,25 m/s, joka ylläpidetään muuttamalla kulmanopeutta 3,5:sta 8 kierrokseen minuutissa lukusäteen tullessa reunalta keskustaan kohti. Esimerkissä syötetiedostona wavin/gimmela.wav, toimenpiteenä hyppy ja ulostulona kuultavissa wavin/gimmelacd.wav. 3.3.5 MP3-tiedosto 2004 Yhtenä esimerkkinä nykyhetken äänenlaadun vaihtelusta on MP3-tiedostojen (MPEG-4 Layer 3) esittäminen eri bittimäärillä. Tässä esimerkissä ei ole käytetty työkalupakin Matlab-funktioita vaan tiedostot on tallennettu (millä tahansa) Internetistä löytyvällä MP3-ohjelmalla eri tasoisiksi. Alkuperäinen tiedosto on ollut CD-tason ääntä eli näytteenottotaajuutena 44100 Hz ja jokaista näytettä esitetty 16 bitillä. Tiedostot on tallennettu MP3-muotoon eri bittivirroilla: 192 kbps, 128 kbps, 96 kbps, 64 kbps, 32 kbps sekä 8 kbps, joka on pienin bittimäärä määritelty MP3:lle ja jossa ilmenee selkeästi äänen huono laatu. Äänitiedostot on kuultavissa hakemistossa http://www.cis.hut.fi/parvi/ Heureka/MP3/. Mukana ovat myös MP3-tiedostoista takaisin WAV-muotoi-

18 3 TULOKSIA siksi muutetut. Taulukossa 4 näkee tiedostojen koon, mikä osoittaa, että psykoakustiikkaa hyväksikäyttävä MP3 pystyy pakkaamaan ääntä tehokkaasti. nimi st/mono bit fs/kbs koko B nayte192kbs.mp3 192 347 324 nayte128kbs.mp3 128 231 549 nayte96kbs.mp3 96 173 662 nayte64kbs.mp3 64 116 193 nayte32kbs.mp3 32 58 514 nayte8kbs.mp3 8 14 629 nayte192kbs.wav stereo 16 44100 2 552 876 nayte128kbs.wav stereo 16 44100 2 552 876 nayte96kbs.wav stereo 16 44100 2 552 876 nayte64kbs.wav stereo 16 22050 1 281 068 nayte32kbs.wav stereo 16 11025 645 164 nayte8kbs.wav mono 16 11025 322 604 Taulukko 4: Äänitiedoston nimi, ominaisuudet ja koko tavuissa. Taulukon yläosassa tiedostot MP3-muotoisina ja alaosassa WAV-muotoisina. MP3- tiedostojen koko on vain pieni murto-osa WAV-muotoisista. 3.3.6 Yhteenveto Huononnusfunktiot toimivat, mutta parametrien säätämisessä on nähtävä vaivaa. Lisäksi erilaiseen ritinään ja rahinaan tulee kehittää parempia malleja luontevamman äänen saamiseksi. Taulukossa 5 kooste tuloksista, jotka löytyvät hakemistosta http://www.cis.hut.fi/parvi/heureka/wavout/. Äänitiedosto BrandDream78rpm.wav BrandDream33rpm.wav cd02fono.wav gimmelacd.wav Luonnehdinta Savikiekko gramofonissa Naarmuuntunut LP-levy Puhetta fonografista CD-levy jumittaa Taulukko 5: Esimerkkiajojen tulokset wavout-hakemistossa.

19 4 Pohdinta Tässä työssä on tutkittu äänen laadun tahallista heikentämistä tavoilla, jotka muistuttaisivat vanhoja äänitteitä. Ohjelmakoodi on saatavilla ja muutamat esimerkit osoittavat, että kohtuullisiin tuloksiin on mahdollista päästä. Toisaalta oikeasti vanhan oloista musiikkia näyttää olevan todella vaikea saada aikaiseksi nykyaikaisesta musiikista. Yksi syy tähän on monitahoinen äänitystekniikka, jossa eri instrumentit miksataan halutuiksi. Äänen kuuleminen tietokoneen kaiuttimesta tai kuulokkeista on eri asia kuin että sen kuulee oikeasta gramofonista oikean kartiotorven vahvistamana. Kolmas tekijä voisi olla se, että kuulija saattaa tunnistaa musiikin olevan tältä päivältä eikä sata vuotta vanha. Toukokuussa 2004 suomalainen keräilijä esitteli vanhoja soittimia Helsingin yliopiston Musiikkikirjastossa. Kuulijalle oli pienehkö yllätys, että lähes sata vuotta vanhasta mekaanisesta gramofonista voidaan saada niin puhdas ja kaunis ääni, kunhan levy on vähän käytetty sekä äänirasia ja -neula ja itse soitin ovat kunnossa. Monissa arkistoissa ja levykaupoissa on runsaasti aivan uunituoreita 50 vuotta vanhoja levyjä, jotka soivat puhtaasti.

20 A MATLAB-FUNKTIOT A Matlab-funktiot Kaikki alla olevat funktiot on saatavilla Internetistä osoitteesta http://www. cis.hut.fi/parvi/heureka/, jonne niiden mahdollisia uusia versioita päivitetään. Alla olevat tiedostot ovat siinä muodossa, missä ne olivat 24.6.2004. A.1 Matlab-funktio analysoikaistat.m 1 function [zout] = analysoikaistat(y, fs, kaistat, N) 2 % ANALYSOIKAISTAT jakaa signaalin y eri taajuuskaistoille analysointia varten. 3 % 4 % [zout] = analysoikaistat(y, fs, kaistat, N) 5 % 6 % y (len x ch) jos stereo, huomioidaan vain 1. kanava 7 % fs (1 x 1) näytteenottotaajuus 8 % kaistat (1 x V) rajataajuudet (Hz) haluttujen eri kanavien välillä 9 % 0 << kaistat(1)... kaistat(end) << fs/2 10 % N FFT-N, N parilline 11 % zout (len x K) kanavakohtaiset äänivektorit, joita voi 12 % esim. kuunnella soundsc(zout(:,1), fs), jne 13 % 14 % JP 030304,310304 15 16 % TOTEUTUS: Kaistoille jako tehty elliptisillä IIR-suotimilla, jotka 17 % saattavat tulla epästabiileiksi, jos rajataajuudet ovat 18 % lähellä toisiaan. Rajataajuuksissa on koodissa määrätty transitiokaista, 19 % tr = 300 (Hz), Rp = 1 (db), Rs = 60 (db) 20 % 21 % Kommentteja: 22 % Tylystä jakamisesta eri kaistoille 23 % tulee sellaista pientä väpätystä - en arvaa syytä?! 24 % 25 % VAROT 26 % 2: alku ja lopputeksti 27 % 6: kaistakohtaiset suodatukset, lopputuloksen piirtäminen 28 % 9: kaistakohtaisien suotimien piirtäminen 29 30 global VAROT 31 if VAROT>=2 32 tic 33 disp([mfilename : alkaa kaistoihin jako... ]); 34 end; 35 36 if (nargin == 2) 37 kaistat = [fs/8 : fs/8 : 3*fs/8]; 38 end; 39

A.1 Matlab-funktio analysoikaistat.m 21 40 [len, nch] = size(y); 41 if len < nch 42 y = y ; 43 warning([mfilename : transponoidaan y pystyvektoriksi/matriisiksi ]); 44 end; 45 if (nch >= 2) 46 y = y(:,1); % stereosta vain toinen kaista 47 warning([mfilename : huomioidaan vain y:n ensimmäinen kanava ]); 48 end; 49 tr = 300; % transitiokaista (Hz) 50 WB = 2*kaistat/fs; % kanavien rajataajudet 51 WL = 2*(kaistat-tr)/fs; % rajataajuuden vas.puol. oleva rajataajuus Wp/Ws 52 WR = 2*(kaistat+tr)/fs; % rajataajuuden oik.puol. oleva rajataajuus Wp/Ws 53 Rp = 1; 54 Rs = 60; % PIDÄ JÄRKEVÄNÄ - VARO EPÄSTABIILEJA SUOTIMIA 55 K = length(kaistat)+1; 56 zout = zeros(length(y),k); 57 58 % ALIPÄÄSTÖ 59 [N,Wn] = ellipord(wb(1), WR(1), Rp, Rs); 60 [B,A] = ellip(n, Rp, Rs, Wn); 61 zout(:,1) = filter(b,a,y); 62 if VAROT>=6 63 disp([mfilename : alipäästö tehty! ]); 64 end; 65 if VAROT>=9 66 clf; 67 subplot(k,1,1); 68 [H,W] = freqz(b,a,4096,fs); 69 plot(w, 20*log10(abs(H))); 70 grid on; 71 axis([0 fs/2-100 10]); 72 end; 73 74 % KAISTANPÄÄSTÖT 75 for k=2:k-1 76 [N,Wn] = ellipord([wb(k-1) WB(k)],[WL(k-1) WR(k)], Rp, Rs); 77 [B,A] = ellip(n, Rp, Rs, Wn); 78 zout(:,k) = filter(b,a,y); 79 80 if VAROT>=6 81 disp([mfilename : kaistanpäästö num2str(k-1) / num2str(k-2) tehty! ]); 82 end; 83 84 if VAROT>=9 85 subplot(k,1,k); 86 [H,W] = freqz(b,a,4096,fs); 87 plot(w, 20*log10(abs(H))); 88 grid on;

22 A MATLAB-FUNKTIOT 89 axis([0 fs/2-100 10]); 90 end; 91 end; 92 93 % YLIPÄÄSTÖ 94 [N,Wn] = ellipord(wb(end), WL(end), Rp, Rs); 95 [B,A] = ellip(n, Rp, Rs, Wn, high ); 96 zout(:,k) = filter(b,a,y); 97 if VAROT>=6 98 disp([mfilename : ylipäästö tehty! ]); 99 end; 100 101 if VAROT>=9 102 subplot(k,1,k); 103 [H,W] = freqz(b,a,4096,fs); 104 plot(w, 20*log10(abs(H))); 105 grid on; 106 axis([0 fs/2-100 10]); 107 figure; 108 end; 109 110 if VAROT>=6 111 clf; 112 tmh = ceil(size(zout,1)/40000); 113 t = [1 : size(zout,1)]/fs; 114 for k=1:k 115 subplot(k,1,k), 116 plot(t(1:tmh:end), zout(1:tmh:end,k)) 117 axis tight 118 strk = [0 kaistat fs/2]; 119 stryl = {num2str(strk(k)),num2str(strk(k+1))}; 120 ylabel(stryl); 121 end; 122 xlabel( aika (sek) ); 123 end; 124 125 if VAROT>=2 126 kesto = num2str(round(toc*100)/100); 127 disp([mfilename :... tehty! ( kesto s) ]); 128 end; A.2 Matlab-funktio huojunta.m 1 function yout = huojunta(y, fs, Td, dr, da) 2 % HUOJUNTA lisää jaksollista huojuntaa. 3 % 4 % yout = huojunta(y, fs, [Td, dr, da])

A.2 Matlab-funktio huojunta.m 23 5 % Td yhteen kierrokseen kuluva aika (sekunneissa) 6 % dr säde soittokohdalla (metreissä) 7 % da poikkeama keskipisteestä (metreissä) 8 % 9 % Levyn reikä (sylinterin akseli) ei ole keskellä levyä. 10 % Neula lukee arvoja eri nopeuksilla, jolloin tapahtuu 11 % pientä jaksollista taajuuden muuttumista, huojumista. 12 % Monien mielestä erittäin vastenmielinen efekti. 13 % 14 % Huojunnan poistamisessa pitää yrittää löytää taajuuksia, 15 % joiden perusteella huojunnan määrä (poikkeama) voidaan 16 % päätellä. 17 % 18 % Tyypillisiä arvoja: 19 % Td 60/33.3 LP, 60/45 single, 60/78 78rpm 20 % dr 0.07-0.15 LP, 0.05-0.07 single,??? 21 % da 0.002 (2mm?), 0 <= da < dr, da ~ 0 22 % 23 % Default-arvot: 24 % Td = 60/33 25 % dr = 0.065 26 % da = 0.002 27 % 28 % JP 020304 29 30 % Jukka Parviainen, 2.3.2004 31 % 32 % Toteutus: Laskettu kahdesta kolmiosta, jotka muodostuvat 33 % matemaattisen keskipisteen, virheellisesti väärässä 34 % paikassa oleva keskipisteet (poikkeutus a) ja 35 % neulan lukukohdasta. 36 % 37 % Lasketaan kierros kerrallaan for-loopissa - 38 % voisi tehdä yhtenäkin operaationa. 39 % 40 % Voidaan tehdä joko RESÄMPLÄYKSEN KANSSA tai ilman: 41 % muuttuja "tehdaan_resamplays". 42 % Resämpläys "resker"-kertaistaa datan ja pitäisi siten tuottaa 43 % paremman tuloksen. Tosin tästä ei ole mitään empiiristä 44 % havaintoa... 45 % 46 % TODO: Lagrange-interpolointi pyöristykseen, 47 % viimeisen kesken jäävän kierroksen näytteiden huojuttaminen 48 49 global VAROT 50 if VAROT>=2 51 tic 52 disp([mfilename : Huojunnan lisäys alkaa... ]); 53 end;

24 A MATLAB-FUNKTIOT 54 55 % default-arvot: 56 if nargin < 3 57 Td = 60/33; 58 dr = 0.065; 59 da = 0.002; 60 end; 61 62 Ndr = round(td*fs); % näytemäärä yhdellä kierroksella 63 len = size(y,1); % pituus näytteinä 64 nch = size(y,2); % kanavien määrä 65 yout = zeros(len, nch); % alustus 66 k = 0; % for-looppi-indeksi 67 kmax = floor(len/ndr); 68 69 tehdaan_resamplays = 0; % valitaan toteutustapa 70 resker = 10; % resamplayskerroin 71 72 if tehdaan_resamplays 73 w10 = [0 : (2*pi/(resker*Ndr)) : 2*pi - (2*pi/(resker*Ndr))]; 74 beta = asin(da.*sin(w10)/dr); 75 alfa = (w10 + beta) ; % pystyvektoriksi 76 tmp10= zeros(ndr*resker, nch); % alustus resämplättyä varten 77 78 if (VAROT >= 5) 79 disp([mfilename : käytetään resämpläystä R = num2str(resker)]); 80 end; 81 82 % kierros kerrallaan: 83 for m = [1: Ndr : len-ndr+1] 84 85 if (VAROT >= 5), 86 k = k+1; 87 disp([mfilename : kierros num2str(k) / num2str(kmax)]); 88 end; 89 90 tmp10 = resample(y(m: m+ndr-1, :), resker, 1); 91 tmp2 = tmp10(round(resker*ndr*alfa/(2*pi))+1, :); 92 yout(m : m+ndr-1, :) = resample(tmp2, 1, resker); 93 end; 94 95 else % ilman resämpläystä 96 w = [0 : (2*pi/Ndr) : 2*pi - (2*pi/Ndr)]; 97 beta = asin(da.*sin(w)/dr); 98 alfa = (w + beta) ; % pystyvektoriksi 99 tmp = zeros(ndr, nch); % alustus ilman resämpläystä 100 101 % kierros kerrallaan: 102 for m = [1: Ndr : len-ndr+1]

A.3 Matlab-funktio hyppy.m 25 103 104 if (VAROT >= 5), 105 k = k+1; 106 disp([mfilename : kierros num2str(k) / num2str(kmax)]); 107 end; 108 109 tmp = y(m: m+ndr-1, :); 110 tmp2 = tmp(round(ndr*alfa/(2*pi))+1, :); 111 yout(m : m+ndr-1, :) = tmp2; 112 end; 113 end; 114 115 % viimeisen kierroksen loput alkiot (IF-sisään) 116 % TODO!!! 117 118 if VAROT>=2 119 kesto = num2str(round(toc*100)/100); 120 disp([mfilename :... tehty! ( kesto s) ]); 121 end; 122 A.3 Matlab-funktio hyppy.m 1 function yout = hyppy(y, fs, Ta, Td, Tx, Tz, jatk) 2 % HYPPY toteuttaa neulan hyppäämisen samalle uralle 3 % 4 % yout = hyppy(y, fs, Ta, Td, Tx, Tz, jatk) 5 % Ta (Mx1), alkamisajankohdat (sekunneissa) 6 % Td (1x1), hypyn kesto = kierrosaika (sekunneissa) 7 % Tx (1x1), hypyn aikana poistettava osuus (sekunneissa) 8 % Tz (1x1), viimeisen hypyn aikana poistettava osuus (sekunneissa) 9 % jatk (1x1), jatkuuko viimeisen alkamisajankohdan 10 % jälkeen (0=ei/1=kyllä) oikeaa pyörimistä 11 % 12 % Oletusarvot: 13 % Ta = [0.6 0.6 0.6 0.6]*lensec 14 % Td = 60/33 15 % Tx = 0.02 s 16 % Tz = 2*60/33 s 17 % jatk = 1 18 % 19 % JP 020304 20 21 % Jukka Parviainen, 2.3.2004 22 % 23 % Toteutus: Leikataan pala, jota aletaan toistamaan length(ta) kertaa. 24 %

26 A MATLAB-FUNKTIOT 25 % Tulisiko siihen joku häiriökohtalisäksi...? naarmujakso.m??? 26 27 global VAROT 28 if VAROT>=2 29 tic 30 disp([mfilename : Paikalleenjäämisen lisäys alkaa... ]); 31 end; 32 33 [len, nch] = size(y); 34 lensec = len/fs; 35 36 % default-arvot: 37 if nargin < 3 38 Ta = [0.6 0.6 0.6 0.6] *lensec; 39 Td = 60/33; 40 Tx = 0.02; 41 Tz = 2*60/33; 42 jatk = 1; 43 end; 44 45 if (size(ta,1) < size(ta,2)) 46 Ta = Ta ; 47 warning([mfilename : Ta transponoitu pystyvektoriksi ]); 48 end; 49 50 Ndr = round(td*fs); 51 Ntx = round(tx*fs); 52 indta = round(ta*fs) - Ntx; 53 indto = [(indta(1) - Ndr); (indta(2:end)-ndr)]; 54 % indto(1) -> indta(1) 55 56 yout = y(1:indta, :); % alku normaalina 57 for k = 1:length(indTa) 58 yout = [yout; y(indto(k):indta(k), :)]; 59 end; 60 61 indtz = round(tz*fs); 62 if (indtz+indto(end) < len) 63 indto(end) = indto(end)+indtz; 64 end; 65 66 if jatk 67 yout = [yout; y(indto(end):end, :)]; 68 end; 69 70 if VAROT>=2 71 kesto = num2str(round(toc*100)/100); 72 disp([mfilename :... tehty! ( kesto s) ]); 73 end;

A.4 Matlab-funktio kampa.m 27 74 A.4 Matlab-funktio kampa.m 1 function [yout, B, A] = kampa(y, fs, cf, af, pf, zf) 2 % KAMPA vahvistaa harmonisia taajuuksia. 3 % 4 % yout [, B, A] = kampa(y, fs, [cf, af, pf, zf]) 5 % B suotimen osoittajapolynomi B(z), H=B/A 6 % A suotimen nimittäjäpolynomi A(z), H=B/A 7 % cf kamman piikkien väli (Hz), perustaajuus 8 % af painokerroinvektori alkaen ensimmäisestä 9 % harmonisesta (perustaajuudesta). 10 % Skaalatut arvot: noin 0.8 < af < 1 11 % pf Navan vahvistuskerroin: pf < 1, 12 % pf == 1 napa yksikköympyrällä; 13 % tehokas vasta kun lähellä ykköstä. 14 % zf Nollan vahvistuskerroin, zf < pf 15 % 16 % Oletusarvot: 17 % cf 250 Hz 18 % af [...] 19 % pf 20 % zf 21 % 22 % Varoitus: Voi tulla helposti epästabiiliksi, jos 23 % kireät arvot, navat "liian" lähellä yksikköympyrää. 24 % 25 % Mekaanisessa nauhoituksessa piti huutaa äänitorveen 26 % joka kokosi ääntä. Ilma värähtelee putkessa ja aiheuttaa 27 % "ominaisvärähtelyjä" (kuten kaikki puhallinsoittimet!). 28 % 29 % JP 300304 30 31 % Jukka Parviainen, 30.3.2004 32 % 33 % Toteutus: Muodostetaan napa-nolla pareja lähelle 34 % yksikköympyrää. Mitä lähempänä napa ja nolla ovat toisiaan, 35 % sitä kapeampi on piikki. Mitä lähempänä nolla on yksikköympyrää, 36 % sitä voimakkaampi piikki. 37 % 38 % KATSO mat2303.m 39 % 40 % Voisiko toteuttaa jollakin multirate-judanssilla tms: 41 % Tehdään ensi ylipäästösuodin ja sitten lisätään näytt.ottotaaj. 42 43 global VAROT

28 A MATLAB-FUNKTIOT 44 if VAROT>=2 45 disp([mfilename : Lisätään putkea... ]); 46 end; 47 48 if ((nargin < 2) (nargin > 6)) 49 error( Väärä määrä argumentteja ); 50 end; 51 if (nargin < 6) 52 C = 0.98; % suhde nava ja nolla läheisyys 53 pf = 0.995; % napojen perusetäisyys 54 zf = pf * C; % nollien perusetäisyys 55 if (nargin == 5) 56 warning([mfilename : pf määrätty ]); 57 end; 58 end; 59 if (nargin < 4) 60 % suhteelliset osuudet 61 %af = 0.01 * [93 100 97 95 94 92 88 85]; % löysähkö 62 %af = 0.01 * [95 100 99 98 96 93 91 90]; 63 af = 0.001 * [990 1000 998 997 995 991 987 985]; 64 end; 65 if (nargin < 3) 66 cf = 350; % perustaajuus cf Hz 67 end; 68 69 % Muokataan varuilta vektoria "af" 70 tmpm = floor((fs/2)/cf); % kuinka monta harmonista maksimissaan 71 tmpaf = length(af); 72 if (tmpaf > tmpm) 73 af = af(1:tmpm); 74 end; 75 76 p = []; % navat 77 z = []; % nollat 78 w = 2*pi*cF/fs; % norm. kulmataajuus (2 pi f/fs) 79 mm = find(af~=0); % vain nollasta eroavien arvojen indeksit 80 n = 0; 81 82 for k=1:length(mm) 83 n = n+1; 84 tmp = pf*af(mm(n))*exp(j*w*mm(n)); % napa 85 tmp = [tmp; conj(tmp)]; % ja sen konjugaattipari 86 p = [p; tmp]; % lisätään napojen vektoriin 87 tmp = zf*af(mm(n))*exp(j*w*mm(n)); % sama nollille 88 tmp = [tmp; conj(tmp)]; 89 z = [z; tmp]; 90 end; 91 92 % Tulostetaan navat ja nollat:

A.5 Matlab-funktio kartiotorvi.m 29 93 if (VAROT > 7) 94 figure(20), zplane(z, p); 95 end; 96 97 [B, A] = zp2tf([z],[p],1); % epästabiili?!?!?! 98 [HH, WW] = freqz(b,a); 99 B = B/max(abs(HH)); % skaalaus 100 101 [z2,p2,k2] = tf2zp(b, A); 102 if (sum(abs(p2)>1) > 0) 103 warning([mfilename : Suodin on epästabiili! ]); 104 disp( Navat ennen ja jälkeen: ); 105 disp([abs(p) abs(p2)]); 106 error([mfilename : HUOM! SUODATUS TOD.NÄK. EPÄONNISTUNUT! ]); 107 end; 108 109 if (VAROT > 4) 110 figure(21), freqz(b,a,4096,fs); 111 end; 112 113 if (VAROT>=5) 114 disp([mfilename : Suodatetaan torven läpi... ]); 115 end; 116 117 yout = filter(b, A, y); 118 119 if (VAROT>=2) 120 disp([mfilename :... tehty! ]); 121 end; 122 A.5 Matlab-funktio kartiotorvi.m 1 function [yout, b, a] = kartiotorvi(y,fs); 2 % KARTIOTORVI tuottaa torven vasteen 3 % 4 % [yout, b, a] = kartiotorvi(y, fs); 5 6 % OSSI 210604 7 8 global VAROT 9 if VAROT>=2 10 tic 11 disp([mfilename : Kartiotorven lisäys alkaa... ]); 12 end; 13 14 x0 = 0.07; % kohta josta kartio alkaa

30 A MATLAB-FUNKTIOT 15 le = 0.4; % torven efektiivinen pituus 16 c = 340; % äänennopeus 17 k=2*pi*logspace(0,4,300)/c; 18 a=0.30; % torven suun säde torven suulla 19 20 %Z1=(k*x0).^2./(1+(k*x0).^2)+i*k*x0./(1+(k*x0).^2); 21 figure(1) 22 Y2=coth(0.5*(k*a.^2)+i*k*le)-i*1./(k*x0); 23 Z2=1./Y2; 24 f=300*k/(2*pi); 25 26 plot(f,real(z2),f,imag(z2)) 27 set(gca, YTick,10.^([-30,-20,-10,-6,-3,0,3,6]./20)); 28 set(gca, YTickLabel,{ -30dB, -20dB, -10dB, -6dB, -3dB, 0, 3dB, 6dB }) 29 axis([0 6000 10.^(-30/20) 1]); 30 title( Äärellisen kartioputken impedanssivaste ) 31 xlabel( taajuus ) 32 33 figure(2) 34 plus=-0.212 ; 35 b=0.92+plus; %nollat 36 b=1.000; %toimii 37 %b=0.94976; 38 a=0.921+plus; %navat 39 a=0.95; %toimii 40 %b=0.99; 41 %a=0.98999; 42 rnollat=[0.925 0.989 0.989 0.989 b b b b b b b b]; 43 %rnollat=[rnollat rnollat]; 44 piikki=340; 45 alfanollat=[piikki 2*piikki 3*piikki 4*piikki]*pi/22050; 46 %alfanollat =[alfanollat alfanollat]; 47 rnavat=[0.998 0.997 0.995 0.99 0.89 a a a a]; 48 %rnavat=[rnavat rnavat]; 49 alfanavat=[piikki 2*piikki 3*piikki 4*piikki]*pi/22050; %siisti 4 piikillä 50 %alfanavat=[alfanavat alfanavat]; 51 navat=[0]; 52 nollat=[0]; 53 for k=1:1:length(alfanollat) 54 nollat(k)=rnollat(k)*(cos(alfanollat(k))+i*sin(alfanollat(k))); 55 end 56 nollat2=nollat - 2*i*imag(nollat); 57 nollat=[nollat2 nollat]; 58 59 for k=1:1:length(alfanavat) 60 navat(k)=rnavat(k)*(cos(alfanavat(k))+i*sin(alfanavat(k))); 61 end 62 navat2=navat - 2*i*imag(navat); %kompleksikonjugaatit 63 navat=[navat2 navat];

A.5 Matlab-funktio kartiotorvi.m 31 64 65 figure(4) 66 navat=[0.8063,0.8836 + 0.1661i,0.8836-0.1661i,navat]; %Lisätään 3. asteen Butterworth ylipääst 67 nollat=[1 1 1 nollat]; 68 plot(real(navat),imag(navat), + ) 69 hold on; 70 plot(real(nollat),imag(nollat), o ) 71 hold off 72 axis([-1 1-1 1]) 73 [X,Y,Z]=sphere(200); 74 hold on; 75 plot(x(100,:),y(100,:)); 76 hold off; 77 %zplane(nollat,navat,44100) 78 79 80 [b,a] = zp2tf(nollat,navat,1); 81 %figure(6) 82 figure(2) 83 freqz(b,a); 84 [h1,w1]=freqz(b,a,2048,44100); %[h1,w1]= 85 86 figure(5) 87 semilogy(w1,abs(h1));%*fs/2/pi 88 set(gca, YTick,10.^([-30,-20,-10,-6,-3,0,3,6]./20)); 89 set(gca, YTickLabel,{ -30dB, -20dB, -10dB, -6dB, -3dB, 0, 3dB, 6dB }) 90 axis([0 6000 10.^(-50/20) 2]); 91 %grid on; 92 %axis([0 10000 10^(-10/20) 1.2]); 93 %set(gca, XTick,[10 100 500 1000 5000 10000 15000 20000]); 94 %set(gca, XTickLabel,{ 10, 100, 500, 1k, 5k, 10k, 15k, 20k }) 95 96 title( Suotimen taajuusvaste ); 97 xlabel( Taajuus ); 98 ylabel( Amplitudi ); 99 zoom on; 100 drawnow 101 102 yout = filter(b,a,y); 103 104 105 if VAROT>=2 106 kesto = num2str(round(toc*100)/100); 107 disp([mfilename :... tehty! ( kesto s) ]); 108 end; 109

32 A MATLAB-FUNKTIOT A.6 Matlab-funktio kohina.m 1 function [yout] = kohina(y, fs, drdb) 2 % KOHINA lisää valkoista kohinaa ja keskimääräistä kohinatasoa 3 % 4 % yout = kohina(y, fs, drdb) 5 % 6 % drdb dynaaminen alue eli suurimman tason ja 7 % keskimääräisen kohinatason suhde desibeleissä 8 % 9 % Oletusarvot: 10 % drdb = 65 (LP), 18 (savikiekko) 11 12 % OSSI / Jukka 240604 13 14 global VAROT 15 if VAROT>=2 16 tic 17 disp([mfilename : Kohinan lisäys alkaa... ]); 18 end; 19 20 if nargin < 3 21 drdb = 65; 22 end; 23 24 dr = 10^(drdB/10); %=1/kohinan ka 25 kohinavakio = 2/dr; %valkoisen kohinan ka = max amplitudi/2; 26 27 kohina = kohinavakio * randn(size(y)); % oli rand...?! 28 yout = y + kohina; 29 30 if VAROT>=2 31 kesto = num2str(round(toc*100)/100); 32 disp([mfilename :... tehty! ( kesto s) ]); 33 end; A.7 Matlab-funktio kvtasot.m 1 function yout = kvtasot(y, fs, M, rajat) 2 % KVTASOT poistaa kvantisointitasoja. 3 % 4 % yout = kvtasot(y, fs, [M, rajat]) 5 % M (1x1) lineaarisen kvantisoinnin määrä 6 % rajat (1xM) kvantisointirajat pienimmästä suurimpaan. 7 % Jos rajat==0, niin oletusarvot, jolloin 8 % muuttujan M vaikutus katoaa. 9 %

A.7 Matlab-funktio kvtasot.m 33 10 % Oletusarvoja: 11 % M = 42 12 % rajat = [[-1 : 0.1 : -0.2] 0 [0.2 : 0.1 : 1]]; 13 % 14 % Hiljaiset äänet katoavat pois. Kohinaa lisäämällä päästään 15 % vastaavaan. Kvantisointitasoja katoaa. 16 % 17 % 18 % JP 030304 19 20 % Jukka Parviainen, 3.3.2004 21 % 22 % Toteutus: 23 % (1) nargin == 3 24 % Lineaarinen kvantisointitasojen vähentäminen. 25 % Pienellä M:llä menee kohinaksi 26 % 27 % (2) nargin == 4 28 % Histogrammi annettujen rajojen mukaan 29 % "help histc" 30 % 31 % Idea olisi varsinkin hiljaisia ääniä puurouttaa 32 % uudet kvantisointitasot 33 % 34 % Ei-lineaarinen operaatio on siis 35 % jonkinlainen histogrammin muutos?! 36 % 37 % EHKÄ TÄN EI TARVIIS OLLA NÄIN TYLY: 38 % M = 928 -> hiljaiset äänet hiljaisemmiksi 39 40 global VAROT 41 if VAROT>=2 42 tic 43 disp([mfilename : Kvantisointitasojen vähennys alkaa... ]); 44 end; 45 46 47 if (nargin <= 3) 48 if (nargin == 2) 49 M = 42; 50 end; 51 % lineaarinen: 52 yout = round(y * M)/M; 53 else 54 % mahdollistaa EPÄLINEAARISEN 55 if (rajat == 0) 56 % default-arvo: 57 rajat = [[-1 : 0.1 : -0.2] 0 [0.2 : 0.1 : 1]]; 58 end;

34 A MATLAB-FUNKTIOT 59 [N, bin] = histc(y, rajat); 60 yout = rajat(bin); 61 end; 62 63 if VAROT>=2 64 kesto = num2str(round(toc*100)/100); 65 disp([mfilename :... tehty! ( kesto s) ]); 66 end; A.8 Matlab-funktio lue.m 1 function [y, fs, nbits, len, nch, lensec] = lue(y_file, fs, nbits) 2 % LUE lukee WAV-muotoisen tiedoston TAI vektorin 3 % ja tarkistaa sen muodon. 4 % 5 % [y, fs, nbits, len, nch, lensec] = lue(y_file, fs, nbits) 6 % 7 % y_file (string/mxn) Äänitiedoston nimi tai äänivektori 8 % fs (1x1) Jos äänivektori, niin näytteenottotaaj. 9 % nbits (1x1) Jos äänivektori, niin bittitarkkuus 10 % 11 % y (MxN) luettu äänivektori 12 % fs (1x1) näytteenottotaajuus 13 % nbits (1x1) bittitarkkuus 14 % len (1x1) pituus merkeissä 15 % nch (1x1) kanavien määrä (mono/stereo) 16 % lensec (1x1) pituus sekunneissa 17 % 18 % Jukka 12.5.2004 19 20 ISOTIEDOSTO = 1.5E6; % merkkejä äänitiedostossa, jotta tulee varoitus 21 22 global VAROT 23 if VAROT>=2 24 disp([mfilename : Äänitiedoston/vektorin tarkistaminen... ]); 25 end; 26 27 28 if (nargin == 1) 29 if (strcmp(class(y_file), char )) 30 31 df = dir(y_file); 32 if length(df)==0 33 error([ Tiedostoa y_file ei ole olemassa! ]); 34 end; 35 36 siz = wavread(y_file, size );

A.8 Matlab-funktio lue.m 35 37 if (siz(1) > ISOTIEDOSTO) 38 % iso tiedosto: luetaanko kaikki vai vain osa 39 disp([mfilename : **** HUOM! **** ]); 40 fprintf(1, Äänitiedosto on varsin suuri (%d x %d) - \n, siz(1), siz(2)); 41 fprintf(1, pituus on todennäköisesti ); 42 fprintf(1, %.1f, siz(1)/44100); 43 fprintf(1, (tai %.1f tai %.1f) sekuntia.\n\n, siz(1)/22050, siz(1)/11025); 44 fprintf(1, Voit lukea ensimmäiset %d, ISOTIEDOSTO); 45 fprintf(1, näytettä (%.1f s), ISOTIEDOSTO/44100); 46 fprintf(1, isosta tiedostosta komennolla:\n ); 47 fprintf(1, >> [y, fs, nbits] = wavread( %s, [1 %d]);\n\n, y_file, ISOTIEDOSTO); 48 fprintf(1, Paina <enter> lukeaksesi kaiken, ); 49 fprintf(1, "8" lukeaksesi yllä mainitun osan\n ); 50 fprintf(1, tai <ctrl-c> keskeyttääksesi... ); 51 dummy = input(, s ); 52 fprintf(1, \n ); 53 tic 54 if (strcmp(dummy, 8 )) 55 [y, fs, nbits] = wavread(y_file, [1 ISOTIEDOSTO]); 56 else 57 [y, fs, nbits] = wavread(y_file); 58 end; 59 else 60 % pieni tiedosto luetaan sellaisenaan 61 tic 62 [y, fs, nbits] = wavread(y_file); 63 end; 64 else 65 error( Jos "y_file" on vektori, anna myös oikea näytteenottotaajuus "fs" ); 66 end; 67 elseif (nargin > 3) 68 error([mfilename : väärä määrä input-argumentteja, "help hm_lue_ja_tarkista" ]); 69 else 70 tic 71 if (strcmp(class(y_file), char )) 72 [y, fs, nbits] = wavread(y_file); 73 else 74 [len, nch] = size(y_file); 75 if (len > nch) 76 y = y_file; 77 else 78 warning([mfilename : Transponoidaan vektori y ]); 79 y = y_file ; 80 end; 81 if (nargin == 2) 82 tmph = ceil(size(y,1)/50000); 83 tmpj = length(unique(y(1:tmph:end,1))); 84 if (tmpj < 255) 85 warning([mfilename : Arvataan bittimäärä/näyte: 8 bit ]);

36 A MATLAB-FUNKTIOT 86 nbits = 8; 87 else 88 warning([mfilename : Arvataan bittimäärä/näyte: 16 bit ]); 89 nbits = 16; 90 end; 91 end; 92 end; 93 end; 94 95 96 [len, nch] = size(y); 97 lensec = len/fs; 98 miny = min(y(:)); 99 maxy = max(y(:)); 100 [histgr,ra]= hist(y(:)); 101 hpr = round(100*histgr/sum(histgr)); 102 103 if (strcmp(class(y_file), char )) 104 fprintf(1, Äänitiedoston nimi: %s\n, y_file); 105 fprintf(1, Äänivektorin nimi: y\n ); 106 else 107 if ~(strcmp(inputname(1), y )) 108 fprintf(1, Äänivektorin alkuperäinen nimi: %s\n, inputname(1)); 109 fprintf(1, Äänivektorin uusi nimi (???): y\n ); 110 else 111 fprintf(1, Äänivektorin nimi (???): y\n ); 112 end; 113 end; 114 fprintf(1, Pituus näytteinä: %d\n, len); 115 fprintf(1, Kanavien määrä: %d\n, nch); 116 fprintf(1, Äänivektorin/matriisin koko: (%d x %d)\n, len, nch); 117 fprintf(1, Pituus sekunneissa: %.2f\n, lensec); 118 fprintf(1, Bittiä / näyte: %d\n, nbits); 119 fprintf(1, Näytteenottotaajuus Hz: %.0f\n, fs); 120 fprintf(1, Näyteväli ms: %.4f\n, 1000/fs); 121 fprintf(1, Näytteiden suurin arvo: %.4f\n, maxy); 122 fprintf(1, Näytteiden pienin arvo: %.4f\n, miny); 123 fprintf(1, Näytteiden histogrammi (%%) :\n ); 124 fprintf(1, %d %d %d %d %d %d %d %d %d %d \n,... 125 hpr(1), hpr(2), hpr(3), hpr(4), hpr(5), hpr(6), hpr(7), hpr(8), hpr(9), hpr(10)); 126 127 kesto = num2str(round(toc*100)/100); 128 129 if VAROT>=2 130 disp([mfilename :... tehty! ( kesto s) ]); 131 end; 132 133

A.9 Matlab-funktio mono.m 37 A.9 Matlab-funktio mono.m 1 function [yout] = mono(y, fs) 2 % MONO keskiarvoistaa stereosignaalin monosignaaliksi 3 % 4 % [yout] = mono(y, fs) 5 6 global VAROT 7 if VAROT>=2 8 tic 9 disp([mfilename : Monotus alkaa... ]); 10 end; 11 12 if (size(y,2)==2) 13 yout = sum(y ) /2; % keskiarvo 14 elseif (size(y,2)==1) 15 yout = y; % mono monona 16 else 17 error([mfilename : äänivektori y pitää olla (Nx1) tai (Nx2) ]); 18 end; 19 20 if VAROT>=2 21 kesto = num2str(round(toc*100)/100); 22 disp([mfilename :... tehty! ( kesto s) ]); 23 end; A.10 Matlab-funktio naarmujakso.m 1 function [yout, ynapsu] = naarmujakso(y, fs, Td, Ta, Vt, vy, ynapsu) 2 % NAARMUJAKSO lisää jaksollista virhettä 3 % 4 % [yout, yn] = naarmujakso(y, fs, Td, Ta, Vt, vy, ynapsu) 5 % Td Levyn kierrosaika, oletus 60/33 6 % Ta Ensimmäisen naarmun kohta (sekunneissa), väli Td 7 % Vt Jos (Mx1) painokertoimet naarmulle (generoitu tai ynapsu) 8 % Jos (1x1), niin muutamia eri oletusarvoja 9 % vy Paljonko jätetään y:ä kuuluviin, 0<vy<1 10 % ynapsu Jos (1x1) niin naarmun pituus sekunneissa. 11 % Jos (Mx1) niin naarmun aaltomuoto 12 % 13 % Oletusarvot: 14 % Td = 60/33 (muita 60/78, 60/45,...) 15 % Ta = 0.2 * lensec; 16 % Vt = 17 % 1: Vt = [0.1 0.2 0.5 0.5 0.25 0.1]; 18 % 2: Vt = [0.8 0.8 0.6 0.6]; 19 % 3: Vt = [0.9 0.8 0.7 0.5 0.4 0.3 0.2 0.1];