Wednesday 15 November 2017

Glidande medelvärde digital filter


Moving Average Crossover System med RSI-filter Enkla system står för de bästa chanserna att lyckas genom att inte bli överdrivet kurvpassning. Att lägga till ett enkelt filter till ett robust system kan dock vara ett utmärkt sätt att förbättra lönsamheten, förutsatt att du också analyserar hur det kan ändra eventuella risker eller företeelser som är inbyggda i systemet. Moving Average Crossover System med RSI Filter är ett utmärkt exempel på detta. Om systemet Systemet använder 30-enheten SMA för snabbmediet och 100-enheten SMA för det långsamma genomsnittet. Eftersom dess snabbrörande medelvärde är en bra bit långsammare än SPY 10100 Long Only Moving Average Crossover System. det bör generera mindre totala handelssignaler. Det blir intressant att se om det leder till en högre vinstfrekvens. Systemet använder också RSI-indikatorn som ett filter. Detta är utformat för att hålla systemet ute av handel på marknader som inte trender, vilket också skulle leda till en högre vinstfrekvens. Systemet går in i en lång position när 30-enheten SMA passerar över 100-enheten SMA om RSI är över 50. Den går in i en kort position när 30-enheten SMA passerar under 100-enheten SMA om RSI är under 50. Systemet går ut en lång position om 30-enheten SMA korsar tillbaka under 100-enheten SMA, eller om RSI faller under 30. Den lämnar en kort position om 30-enheten SMA korsar tillbaka över 100-enheten SMA eller om RSI stiger över 70. Det implementerar också ett bakåtstopp som bygger på volatiliteten på marknaden och sätter ett initialt stopp vid den senaste lågen till en lång position eller den senaste högen för en kort position. Ett dagligt FXI-diagram, EURUSD ETF, visar systemreglerna i åtgärd 30-enhet SMA-kors över 100 enheter SMA RSI gt 50 30-enhet SMA-korsar under 100 enheter SMA RSI lt 50 30-enhet SMA korsar under 100 enheter SMA eller RSI-droppar nedan 30 eller Trailing Stop är träffad, eller Initial Stop är hit Exit Short När: 30 enhet SMA korsar över 100-enheten SMA eller RSI stiger över 70, eller Trailing Stop är slagen, eller Initial Stop är träffad Backtesting Results De backtesting resultat I funna för detta system var från euro vs amerikanska dollar marknaden från 2004 till 2011 med en daglig tidsperiod. Under de sju åren har systemet bara gjort 14 affärer, så det filtrerade definitivt bort en stor del av åtgärden. Frågan är huruvida det filtrerade bort de goda affärer eller de dåliga. Av dessa 14 branscher var åtta vinnare och sex förlorare. Det ger systemet en 57 vinstfrekvens, vilket vi vet kan handlas mycket framgångsrikt förutsatt att vinstgraden också är stark. Backtesting rapporter för valutasystem använder en stat kallad vinstfaktor. Detta nummer beräknas genom att bruttoresultatet divideras med bruttoresultatet. Detta ger oss den genomsnittliga vinsten vi kan förvänta oss per riskenhet. Resultaten för denna backtesting rapport gav detta system en vinstfaktor på 3,61. Det innebär att systemet på lång sikt kommer att ge en positiv avkastning. För en jämförelsepunkt hade Triple Moving Average Crossover System endast en vinstfaktor på 1,10, så det Moving Average Crossover System med RSI är troligen tre gånger mer lönsamt. Det innebär att man använder ett större antal för snabbrörande medel och att lägga till RSI-filtret måste filtrera bort några av de mindre produktiva affärer. Dessa siffror stöds ytterligare av det faktum att den genomsnittliga vinsten var drygt dubbelt så stor som den genomsnittliga förlusten. Trots dessa positiva förhållanden upplevde systemet dock en maximal drawdown på nästan 40. Provstorlek Att det här systemet ger så få signaler är både den största styrkan och den största svagheten. Att placera färre affärer och hålla dem under längre perioder gör att transaktionskostnaderna blir en faktor. Att analysera 14 branscher som inträffade över sju år kan dock leda till att resultaten blir snedställda på grund av liten provstorlek. Jag är nyfiken på hur detta system skulle ha utförts om det handlades över ett dussin olika valutapar under samma tidsperiod. Dessutom skulle hur det skulle ha utförts om backtestet gick tillbaka 50 år eller testat systemet på aktieindex eller råvaror. Det finns tydligt positiv statistik för att motivera ytterligare undersökning av detta system, men det skulle vara dumt att handla riktiga pengar baserat på resultaten från 14 branscher. Handelsexempel Ett exempel på detta system på jobbet kan ses på nuvarande diagram över FXI. Runt 18 mars i år passerade 30-dagars SMA under 100-dagars SMA. Vid den tiden var RSI också under 50. Detta skulle ha utlöst en kort position någonstans strax under 36. Det ursprungliga stoppet skulle antagligen ha placerats över den senaste höga på 38. I mitten av april hade priset sjunkit till 34 och vi skulle ha suttit på en bra vinst. Priset återhämtade sig för att nästan utlösa vårt första stopp vid 38 i början av maj innan vi kraschar nästan hela vägen till 30 i slutet av juni. Det har sedan studsat tillbaka till 34-serien. På något sätt under någon av dessa åtgärder gick 30-dagars SMA tillbaka över 100-dagars SMA, och RSI var under 70. Därför hade ingen av dessa utlöst en utgång. Medan priset kom nära vårt första stopp, kom det inte helt där, så det skulle ha hållit oss i handeln också. Det enda som kunde ha orsakat en utgång skulle ha varit det efterföljande stoppet, vilket skulle ha bero på hur mycket volatilitet vi ställde för att tillåta. Det är fortfarande för tidigt att säga om vi skulle ha blivit stoppade eller inte. Om RSI-indikatorn RSI-indikatorn utvecklades av J. Welles Wilder och presenterades i sin 1978-bok, New Concepts in Technical Trading Systems. Det är en momentumindikator som svänger mellan noll och 100, vilket indikerar hastigheten och prisförändringen. Många momentumhandlare använder RSI som en överskattad översättningsindikator. RSI beräknas genom att först beräkna RS, vilket är medelvärdet för de sista n perioderna dividerat med den genomsnittliga förlusten av de sista n perioderna. Värdet för n är i allmänhet 14 dagar. RS (Average Gain) (Genomsnittlig förlust) När RS har beräknats används följande ekvation för att göra det värdet till en oscillerande indikator: RSI 100 8211 100 (1 RS) Detta ger oss ett värde mellan noll och 100. Valfritt värde ovan 70 anses generellt överköpt, och något värde under 30 anses vara överlåtet. Men eftersom detta system är ett trendföljande system, har överköp och överlåtelse inte haft sina vanliga negativa konnotationer. när man använder en m. a. strategi tar du hänsyn till valutakursen också .. använder du dollarn som din basvaluta Jag har handlat aktier före men aldrig forex, och jag försöker bygga något med python, en forex med en 8gt20 long8lt20 kort , men undrar fortfarande om jag behöver införa räntesatsen för varje valuta i analysen för pamplen. tack för din tid. Jorge Medellin jormoriagmail PS. Jag vet att jokey är lika viktigt som hästen, så i det här fallet menar jag att valutan är valutor i motsats till terminer eller framåtriktade kontrakt. Tack för din anteckning. Den rätta räntan i sig är inte den viktiga biten. Vi är trots allt parhandel. Den starka valutan är den som har den högsta förväntan på stigande räntor. Jag skulle inte uppmärksamma räntorna mycket, åtminstone inte för tillfället. Traders bryr sig mycket mer om kvantitativ lättnad än räntan för tillfället. QE är mycket viktigare och farligare. Vad är ENHETEN av SMA 30-enheten SMA 100-enhet SMA Menar du att det är Period med enkel rörelse Genomsnittlig Alla andra Ja, it8217s SMA-perioden. Den första perioden SMA är 10. Den andra perioden SMA är 100. När de passerar får du en signal om RSI är över 50. Hej Shaun, jag vill börja med att tacka dig för din mycket informativa blogg och artiklar. Jag hoppas att jag kommer att kunna hjälpa andra handlare i framtiden som du gör. Jag har konstruerat och använt en filtrerad momentumindikator som ett filter i andra strategier på ett demokonto. Jag funderade inte på att använda RSI eftersom jag inte gillar att använda indikatorer som i grunden visar samma sak (de flesta indikatorer reflekterar sin fart på ett eller annat sätt medan andra inte har någon rationell förklaring). Men efter att ha läst din artikel ovan ersatte jag min momentumindikator med RSI. Resultaten är verkligen lovande med mycket mindre whipsaw i jämförelse. Jag ska försöka hitta tiden att skriva en EA och backtest strategin. Varför tror du att det var så stor drawdown Är det inneboende i MA crossover-strategin Eller orsakas det av RSI Mer än sannolikt it8217s båda. Jag personligen ogillar inte RSI. I8217ll är säker på att göra en glidande genomsnitts jämförelse för dig i Quantilator också. It8217 är det enklaste och mest objektiva sättet att välja mellan olika strategier. Bildfiltrering kan grupperas i två beroende på effekterna: Lågpassfilter (utjämning) Lågpassfiltrering (aka utjämning), används för att avlägsna högt rumsfrekvent ljud från en digital bild . Lågpassfiltrarna brukar använda rörlig fönsteroperatör som påverkar en pixel av bilden åt gången, ändrar sitt värde med någon funktion av en lokal region (fönster) av pixlar. Operatören flyttar över bilden för att påverka alla pixlar i bilden. Högpassfilter (Kantdetektion, skärpning) Ett högpassfilter kan användas för att göra en bild skarpare. Dessa filter betonar fina detaljer i bilden - motsatsen till lågpassfiltret. Högpassfiltrering fungerar på samma sätt som lågpassfiltrering, det använder bara en annan konvolutkärna. När man filtrerar en bild påverkas varje pixel av sina grannar, och nettoeffekten av filtrering flytta informationen runt bilden. I det här kapitlet, använd den här bilden: Sök efter bogotobogo-webbplats: Bogotobogos webbplatssökning: Medel filtrering är lätt att implementera. Den används som en metod för utjämning av bilder, vilket reducerar intensitetsvariationen mellan en pixel och den andra resulterar i att minska bruset i bilder. Tanken med genomsnittlig filtrering är helt enkelt att ersätta varje pixelvärde i en bild med medelvärdet (medelvärdet) för sina grannar, inklusive sig själv. Detta medför att eliminera pixelvärden som inte är representativa för omgivningen. Medel filtrering anses vanligen som ett konvolutionsfilter. Liksom andra omvälvningar baseras den kring en kärna, som representerar formen och storleken på grannskapet som ska samplas vid beräkningen av medelvärdet. Ofta används en 3 gånger 3 kvadratkärna, som visas nedan: Mf är medelfilteret: Filtret2 () definieras som: Y filter2 (h, X) filtrerar data i X med det tvådimensionella FIR-filtret i matris h. Det beräknar resultatet, Y, med hjälp av tvådimensionell korrelation och returnerar den centrala delen av korrelationen som är lika stor som X. Den returnerar den del av Y som specificeras av formparametern. formen är en sträng med en av dessa värden: full. Returnerar den fullständiga tvådimensionella korrelationen. I detta fall är Y större än X. samma. (standard) Returnerar den centrala delen av korrelationen. I detta fall är Y lika stor som X. Giltig. Returnerar endast de delar av korrelationen som beräknas utan nollpolade kanter. I det här fallet är Y mindre än X. Nu vill vi tillämpa den kärna som definierades i föregående avsnitt med hjälp av filter2 (): Vi kan se att den filtrerade bilden (höger) har blurts lite i jämförelse med den ursprungliga ingången (vänster) . Som tidigare nämnts kan lågpassfiltret användas för avbening. Låt oss testa det. Först, för att göra inmatningen lite smutsig spraya vi lite peppar och salt på bilden och applicerar sedan medelfilteret: Det har viss effekt på salt - och pepparbröstet men inte mycket. Det gjorde dem bara suddiga. Vad sägs om att försöka matlabs inbyggda medianfilter bogotobogo webbplats sökning: bogotobogo webbplats sökning: Median filter - medfilt2 () Här är manuset: Mycket bättre. Till skillnad från föregående filter som bara använder medelvärde, den här gången använde vi median. Medianfiltrering är en olinjär operation som ofta används vid bildbehandling för att minska salt - och pepparljud. Observera också att medfilt2 () är 2-D-filter, så det fungerar bara för gråskalebild. För att ta bort brus för RGB-bild, gå till slutet av detta kapitel: Ta bort ljud i RGB-bild. Matlab tillhandahåller en metod för att skapa ett fördefinierat 2-D-filter. Dess speciella (): h fspecial (typ) skapar ett tvådimensionellt filter h av den angivna typen. Den returnerar h som en korrelationskärna, som är lämplig form att använda med imfilter (). Typen är en sträng som har ett av dessa värden: Matlab Image and Video Processing OpenCV 3 - bildvideobehandling OpenCV 3 bild - och videoredigering med PythonCreated av Olli Niemitalo 2003-01-21, senast ändrad 2012-08-04 1998, Jag hade lite extra tid medan andra läste för slutkurs på högstadiet och kom in i digital signalbehandling. Jag skrev som jag lärde mig, och här är resultatet. Det är inte helt korrekt på platser, men kan fungera som en fin handledning i världen av ljud DSP. Tidigare kallades detta dokument Yehars digitala ljudbehandlingshandledning för Braindead, men jag har lite utvecklats av min scenidentitet genom åren. Njut av ASCII-konsten Detta är skrivet för de audio-digitala signalbehandlingsentusiasterna (som titeln föreslår) och andra som behöver praktisk information om ämnet. Om du inte har detta som en linjär läsupplevelse och stöter på svårigheter, kolla om det finns något som hjälper dig ut i de föregående kapitlen. I filterfrekvensresponsplaner används linjära frekvens - och storleksskalor. Sidändringar är utformade för 60 linjers sidodrivare. Kapitel Shuffling IIR ekvationer är skrivet av min storebror Kalle. Och tack vare Timo Tossavainen för att dela sin DSP-kunskap Kopiera och använd denna text fritt. av Olli Niemitalo, oiki. fi Observera att prov kan innebära (1) ett samplerat ljud eller (2) ett provpunkt Samplad ljuddata är en stapel av prover, amplitudvärden som tas från den faktiska ljudvågen. Samplingsfrekvensen är skottfrekvensen. Till exempel, om frekvensen är 44100, har 44100 prov tagits på en sekund. Heres ett exempel på provtagning: Det ursprungliga ljudet är kurvan och 0s är de samplade punkterna. Den horisontella raka linjen är nollnivån. Ett samplat ljud kan endast representera frekvenser upp till hälften av sampleratet. Detta kallas Nyquist frekvensen. Ett enkelt bevis: Du måste ha lagrat minst två provpunkter per vågcykel, toppen och botten av vågen för att kunna rekonstruera den senare: Om du försöker inkludera över Nyquist-frekvenser i ditt samplade ljud får du allt du behöver är extra distorsion eftersom de förekommer som lägre frekvenser. Ett ljud består av frekvenskomponenter. De ser alla exakt ut som sinusvågor, men de har olika frekvenser, faser och amplitud. Låt oss titta på en enda frekvens: Nu tar vi samma frekvens från ett annat ljud och märker att det har samma amplitud, men motsatt (roterad 180 grader) fas. Sammanslagning av två signaler görs enkelt genom att lägga till dem tillsammans. Om vi ​​gör detsamma med dessa två sinusvågor blir resultatet: Det blir tyst. Om vi ​​tänker på andra fall, där fasskillnaden är mindre än 180 grader, får vi sinusvågor som alla har olika amplituder och faser, men samma frekvens. Heres sättet att beräkna fasen och amplituden för den resulterande sinusvågan. Konvertera amplituden och fasen till ett komplext tal, där vinkel är fasen och absolutvärdet amplituden. Om du gör det till båda sinusvågorna, kan du lägga till dem som komplexa tal. Som du ser är fasen av den nya sinusvågen 45 grader och amplituden sqrt (1212) sqrt (2) ca 1,4. Det är mycket viktigt att du förstår detta, eftersom det i många fall är mer praktiskt att presentera amplituden och fasen av en frekvens som ett komplext tal. När du lägger till två samplade ljud tillsammans kan du faktiskt torka ut vissa frekvenser, de som hade motsatta faser och lika amplituder. Den genomsnittliga amplituden för det resulterande ljudet är (för oberoende original) sqrt (a2b2) där a och b är amplituderna hos de ursprungliga signalerna. Huvudanvändningen av ett filter är att skala amplituderna hos frekvenskomponenterna i ett ljud. Exempelvis dämpar ett lågpassfilter alla frekvenskomponenter över skärningsfrekvensen, med andra ord multiplicerar amplituderna med 0. Det låter genom alla frekvenser under cutofffrekvensen obelagd. Om du undersöker uppförandet av ett lågpassfilter genom att driva olika sinusvågor med olika frekvenser genom det och mäta förstärkningarna får du frekvensfrekvensresponsen. Här är en plot av magnitudfrekvensresponsskurvan för ett lågpassfilter: Frekvensen är på axeln och förstärkningen på axeln. Som du ser är förstärkningen (skalning) av frekvenserna under cutoff-frekvensen 1. Så, deras amplitud påverkas inte på något sätt. Men amplituderna av frekvenser över cutoff frekvensen multipliceras med noll så de försvinner. Filter lägger aldrig till några nya frekvenskomponenter i ljudet. De kan bara skala amplituderna av redan befintliga frekvenser. Om du till exempel har ett helt tyst prov kan du inte få något ljud ur det genom filtrering. Om du har ett sinusvågsprov och filtrerar det, kommer resultatet även att vara samma sinusvåg, bara kanske med olika amplitud och fas - inga andra frekvenser kan visas. Professionella blir aldrig trött på att påminna oss hur viktigt det är att inte glömma fasen. Frekvenskomponenterna i ett ljud har sina amplituder och. faser. Om vi ​​tar en sinusvåg och en cosinovåg ser vi att de liknar varandra, men de har en fasskillnad på pi2, en fjärdedel av en hel cykel. Även när du spelar dem låter de lika. Men försök att bära ett headset och spela sinusvågan på vänstra kanalen och cosinovågan på höger kanal. Nu hör du skillnaden Fas själv innehåller inte viktig information för oss så det hörs inte, men fasskillnaden, av en frekvens, mellan de två öronen kan användas för att uppskatta ljudets ursprung så att det hörs. Filter har ett frekvensfrekvenssvar, men de har även ett fasfrekvenssvar. Heres en exempelkurva som kan vara från ett lowpass-filter: Om du filtrerar ett ljud läggs värdena från fasfrekvensresponsen till faserna av frekvenserna i originalljudet. Linjär (rak linje) fas är samma sak som en vanlig fördröjning, även om det kan se vildt ut i tomten om det går runt flera gånger. Om ditt lågpassfilter exempelvis inte har ett linjärt fasfrekvenssvar kan du inte göra det till ett highpass-filter genom att helt enkelt subtrahera sin utgång från originalet med samma fördröjning. Komplex matte med filter Svaret på ett filter för en enda frekvens kan uttryckas som ett komplext tal, där vinkeln är filterets fassvar och absolutvärdet magnitudsvaret. När du applicerar filtret på ett ljud, gör du faktiskt en komplex multiplicering av alla frekvenskomponenter i ljudet med motsvarande filterresponsvärden. (Läs kapitel Lägga till två sinusvågor tillsammans om du finner det svårt att förstå.) Exempel: Filterets svar är (0,1) vid 1000 Hz. Du filtrerar en sinusvåg, med fält amp amplitudinformation presenterad som det komplexa talet (0,1), med samma frekvens med den: Fas av sinusvågen roterades 90 grader. Ingen ändring i amplituden. Kombinera filter Det kombinerade svaret på dessa två filter sätts i serie är A-svaret multiplicerat med svaret på B (komplexa tal som alltid). Om du bara behöver veta magnitudsvaret, kan du också multiplicera de absoluta värdena. I figuren får båda filerna sina inmatningar från samma källa. Deras utgångar läggs sedan samman igen och bildar slutprodukten. Nu behöver du använda tillägg för att lösa det kombinerade svaret. FIR-filtret är enklare och lättare att förstå. Finitivt impulssvar innebär att när filteringången har förbli noll under en viss tid blir filterutmatningen också noll. Ett oändligt impulsresponsfilter drar inte helt ner efter att ha stängt av ingången, men det blir tystare och tystare. Ett grundläggande FIR-filter kan vara: där input betyder de provvärden som matas till filtret. I det här fallet skulle folk prata om ett 3-knappsfilter. Det är upp till koefficienterna (a0, a1, a2) vad detta filter kommer att göra för ljudet. Att välja koefficientvärdena är den svåraste delen, och det går bra med det senare. För att designa egna filter måste du förstå lite av matematiken bakom och känna till de rätta metoderna. I ovanstående filterexempel används endast tidigare inmatningsvärden. I realtime-filter är detta ett krav, eftersom du inte känner till framtida insatser. I provredigerare och så har du inte denna begränsning, eftersom du har hela inmatningsdata redo när du börjar. Om ditt filter är: och du behöver en realtidsversion av den, konvertera du den bara till: Den enda skillnaden är den enda provfördröjningen i realtidsfiltret. Till skillnad från FIR-filter använder IIR-filter också sina tidigare utgångsvärden för att skapa sin nuvarande produktion. Här är ett enkelt exempel: Detta kan kallas 3 ingångar, 3 utgångsfilter. IIR-filter kan aldrig använda framtida utgångsvärden, eftersom sådana inte finns kvar Det kan finnas flera sätt att implementera samma IIR-filter. Vissa kan vara snabbare än vanliga input-output-and-coefficients sätt. Hur som helst kan varje IIR-filter skrivas i denna form, och det måste användas i filterdesign och undersökning av beräkningar. Ett impulsrespons (vad filtret kommer att göra med en en provpunktsimpuls) av ett IIR-filter ser ofta mer eller mindre ut som detta i samplingsdata: Några dåligt utformade IIR-filter är instabila. Detta leder till att ouput blir hårdare och högre istället för tystare och tystare. Ett enkelt exempel på detta är: utgång (t) ingång (t) 2output (t-1). Så snart det blir inmatningsdata blir det galet. De ovan beskrivna filtertyperna bearbetar datasamplet genom prov. Inte så, om du implementerar ditt filter med FFT, Fast Fourier Transformation. FFT fungerar vanligen på bitar med längd 2n. Först bör du ha ditt planerade filterimpulssvar klart. Konvertera sedan, med FFT, till spektral information - komplexa tal som representerar faser och amplitud av frekvenskomponenterna. Dessa komponenter kallas rutor, eftersom deras frekvenser är fasta och jämnt fördelade, och om de ursprungliga uppgifterna innehöll några mellanfrekvenser, så kommer det mesta av energi av en sådan frekvens att fördelas mellan de närliggande facken. Nu, du FFT också de provdata du vill filtrera och multiplicera de resulterande frekvensfacken med de från filtret. Då används IFFT (Inverse FFT) för att omvandla informationen till en bit av filtrerade provdata. Således resulterade multiplikation av de två frekvensdomändataen i konvolution av de två tidsdomändata. Men det är en fångst: FFT arbetar med periodiska signaler, det vill säga om du har ett filterimpulsrespons så länge som FFT-klumpen, så kommer alla icke-nollprovdata i mitten av FFT-chunk att resultera i att konvolutionen sätter in svansen av filtret runt FFT-gränsen. För att undvika detta problem kan du använda FFT två gånger så länge som filterimpulssvaret, och när FFT på provdata fyller, fyller du bara FFT-inmatningsbufferten halvvägs och anger resten av ingången till noll. För längre ingångar skulle du bearbeta data i bitar så och sedan lägga till de resulterande filtrerade bitarna tillsammans. Detta kallas överlapp-tilläggsmetoden. Ett annat alternativ är överlappning-spara (kolla upp om du vill). FFT kan också användas för att analysera frekvensinnehållet i provdata, oavsett orsak. Om du bara tar en bit av provdata har den skarpa kanter, vilket är dåligt för FFT. Windowing funktioner används för att släta ut dessa kanter. Upphöjda cosinus, cos (xpi2) 2, är en möjlig fönsterfunktion. Här ser du vad som händer när du applicerar den här fönstret till en bit av provdata: Ibland (resampling, precis definierad fördröjning) måste du få provvärden mellan de kända provpunkterna. Det är när du behöver interpolering. Om du inte interpolerar, och bara kasta bort den fraktionerade delen av din provavvikelse, får du mycket högfrekvensförvrängning: I exemplet försöker de ursprungliga provpunkterna representera en sinusvåg. Ju närmare den interpolerade kurvan är en sinusvåg, desto bättre är interpolationsalgoritmen. Den enklaste interpoleringsmetoden är linjär interpolering. Räta linjer dras mellan två intilliggande provpunkter: Fortfarande ser ganska utbrett ut som en sinusvåg. Förbättringen till ointerpolerad är emellertid signifikant. Theres också en nackdel - frekvenserna just under Nyquist frekvensen dämpas, ännu mer än utan interpolering. Heres formeln för linjär interpolering: ny gammal (int) (gammal (int1) - old (int)) frakt, där int betyder heltalets del av provförskjutningen och frakt den delade delen. Nästa steg kan vara Hermitkurva, vilket ger bättre kvalitet på alla sätt än linjär interpolering. Med linjär interpolering behövde du veta 2 provpunkter i taget för att kunna dra ut linjen. Med Hermitkurvan är siffran 4. Interpolationskurvan går genom de två mittpunkterna, och punkterna 1 och 4 används för att forma kurvan. Formeln är en kubik: Och den här här är där a, b, c, d löstes från: En perfekt interpolering existerar också. Genom att ersätta alla provpunkter med korrekt skalade sinc-kurvor, syn (pi x) (pi x) och genom att lägga dem ihop får du exakt, perfekt interpolering. Här är ett av provpunkterna ersatta med en skalad sinc-kurva: Sinc-kurvan är oändlig lång, så du måste använda alla provpunkter i beräkningen av ett interpolerat värde. En praktisk lösning skulle vara att begränsa antalet prover för att säga 1000. Det kommer fortfarande vara för långsamt för en realtidsapplikation, men det ger stor noggrannhet. Om du insisterar på att använda sinc i en realtidsinterpoleringsalgoritm, försök använda en fönsterfönsterfunktion och ett lågt antal (minst 6) sinc-kurvor. Nedsampling Om du vill nedmontera (minska sampleratet) måste du först filtrera bort ovanstående Nyquist-frekvenser, eller de kommer att uppstå som snedvridning i det provtagna provet. I processen med filterdesign behöver du ofta göra kompromisser. För att ha skarpa kanter eller branta sluttningar i storlekssvaret behöver du ett stort och därför långsamt filter. Med andra ord, filter med lågt antal kranar har nästan alltid svagt sluttande magnitudsvar. I fallet med IIR-filter betyder skarpa kanter i storleksordningen ofta en ful (väldigt olinjär) fasfrekvensrespons och nära linjärt fassvar ett svagt sluttande magnitudsvar. Med FIR-filter kan ett försök att skapa mycket skarpa kanter orsaka att vinka i storheterna i närliggande frekvenser. IIR-filter är bra för en realtidsrutin, eftersom de är snabba, kan deras egenskaper (till exempel cutoff frekvens) snabbt ändras i mitten av åtgärden och de låter som riktiga analoga filter. ) Det icke-linjära fasreaktionen av IIR-filter spelar vanligtvis ingen roll. FIR-filter kan användas där kvalitet och linjär fas är viktig, till exempel i en provredigerare. Människor som filtrerar andra signaler än ljud, önskar ofta linjärfasfrekvensrespons. Med stereosignal är det viktigt att ha samma fasförändringar på vänster och höger kanal. Några filter och deras stiliserade frekvensfrekvenssvar: Om du har ett symboliskt beräkningsprogram rekommenderar jag starkt att du använder den i de mekaniska beräkningarna, för att bara göra ditt liv enklare. Derivat är ett gammalt DOS-program, men fortfarande väldigt användbart. Vitt brus Vitt ljud betyder den typ av ljud som har platt spektrum. Du kan enkelt skapa det genom att använda slumpmässiga tal som provvärden. Om du vill veta magnitudfrekvensresponsen hos ett filter, applicera det på ett långt urval av vitt brus och kör sedan en spektrumanalys på utgången. Vad du ser är filtrets magnitudfrekvensrespons. Ett annat sätt är att skicka en samplingsimpuls, som ursprungligen har ett platt spektrum. En impuls ser så här ut i sampledata: 0, 0, 0, 0, 1, 0, 0, 0, 0 - där impulsen är 1 i mitten. Från de två är impulssaken snabbare, men med hjälp av vitt brus kan det ge renare utseende, eftersom fel blir mindre synliga. Av samma skäl, när du tittar på videor, kommer en stillbild att se snöigare än den löpande bilden. Att ta en spektrumanalys på ett långt prov görs vanligen genom att dela den till mindre bitar, analysera dem separat och sedan ta medeltalet av alla analyser. Mitt personliga val här skulle vara programmet Cool Edit 96, som är för Windows. Pole-zero-metoden är det enklaste sättet att designa snabba och enkla IIR-filter. När du har lärt det, kommer du att kunna designa filter själv. Här är det komplexa Z-planet, det som används i polen-nollmetoden: Föreställ dig frekvenserna som ska lindas runt enhetscirkeln. Vid vinkel 0 har vi 0Hz, vid pi2 har vi samplerate4, vid pi har vi samplerate2, Nyquist frekvensen. Du bör inte bry sig om högre frekvenser, eftersom de aldrig kommer att dyka upp i signalen, men i alla fall, vid 2pi (hel cykel) har vi samplingsfrekvensen. Så om du använde samplingsfrekvens 44100 Hz, skulle 0 Hz vara vid (1,0), 11025 Hz vid (0,1) och 22050 Hz vid (-1,0). Vad är poler och nollor då De är söta små saker du kan placera på Z-planet, så här: Det finns några regler du måste komma ihåg. Poler måste alltid vara inuti enhetscirkeln, aldrig ute eller på den. Zeros kan sättas var som helst. Du kan använda ett antal poler och nollor, men de måste alla ha konjugerade par om de inte är placerade på axeln. Konjugatpar betyder att om du exempelvis anger en noll till (0,6, 0,3) måste du lägga en annan noll till konjugatkoordinaten, (0,6, -0,3). Och samma sak med poler. Men hej Vad gör poler och nollor DO Poler förstärker frekvenser, nollor att dämpa. Ju närmare en pol är till en frekvens (på enhetens cirkel, kom ihåg), desto mer förstärks det. Ju närmare en noll är till en frekvens, desto mer blir den dämpad. En noll på enhetens cirkel dämpar helt frekvensen som den sitter på. Nu kan det vara rätt tid att prova ut det själv. Det finns gratis filter design program runt som låter dig spela med poler och nollor. En kandidat kan vara: QEDesign 1000 demo för Windows. Det är någonstans på Internet, hittar du det. Designa ett bandpassfilter Det enklaste filtret som är utformat med pol-noll är följande bandpassfilter: Poler förstärker frekvenser, så du kan dra slutsatsen att den mest förstärkta frekvensen är den i samma vinkel som polen. Och du är nästan rätt Det enda problemet kommer från konjugatpolen, som också ger sin egen förstärkning. Effekten är starkast vid vinklar nära 0 och pi, där avståndet mellan de två polerna är det minsta. Men låt inte det här förvirra dig, kom tillbaka till det senare. Så bestämmer polens vinkel passbandsfrekvensen. Vad är effekten av det absoluta värdet (radien) då Som nämnts förstärker polerna frekvenser och förstärkningen är starkare när polen är närmare en frekvens. I vårt bandpassfilter, ökar polens radie magnitudresponsen att bli brantare och passband smalare, som du ser här: Positioner av poler: Motsvarande magnitudfrekvensresponsdiagram (normaliserad): Låt ringa radie r från och med nu. (Några av er kanske kommer ihåg bokstaven q från analoga resonansfilter. Det här är ungefär detsamma.) I detta fall har vi begränsningen: 0 r lt 1, eftersom polerna måste vara inuti enhetscirkeln. Så byter r ändras branthet, resonans. Denna resonans - det är inte en magisk sak, bara en frekvens förstärks mer än andra. Från poler och nollor till filterkoefficienter Det finns en överföringsfunktion: där z är frekvens, i koordinatformen (komplex) omsluten kring enhetscirkeln. H (z) ger filtrets respons (komplex) vid frekvensen z. P1, P2, P3 och så vidare är positioner av poler och z1, z2, z3 och så vidare positioner av nollor. A0 är den första inmatningskoefficienten för filtret. Heres IIR-filterformeln igen, om du har glömt: Vårt bandpassfilter har bara en pol och dess konjugatpar, så vi kan förenkla överföringsfunktionen: och ersätt p1 och p2 med koordinaterna för konjugatpolerna: Låt oss ge divisor en närmare titt. Säger: Z-krafterna här är faktiskt index till filtrets utgång: Så vi vet hur man beräknar utgångssidan koefficienterna från polens position: OK Låt oss säga att passbandsfrekvensen är vid Z-planet vid position ph: The polen är i samma vinkel som frekvensen på enhetscirkeln men har radie r. Därför: Nu när vi vet hur polens position beror på frekvensen, kan vi skriva om utgångssidan koefficienterna: Men vi får inte glömma utdelningen (av överföringsfunktionen), där kraften i z är index till filterets ingång : Detta måste läggas till vad vi redan har löst från utgångssidan: Nästa måste vi bestämma vad som ska sättas till a0. Detta kallas normalisering. Syftet med a0 är bara att skala ut filtrets utgång. I vårt bandpassfilter vill vi förstärkningen vid passbandsfrekvensen vara 1. Så vi kan skriva ekvationen: Där är nu Filtret är klart: Förbättra det enkla bandpassfiltret Vi kunde kompensera konjugatpolens effekt genom att lägga till en noll på axeln, mellan polerna. Om vi ​​till exempel hade poler vid koordinaterna (0,6, 0,5) och (0,6, -0,5) satte wed noll vid (0.6, 0): Överföringsfunktionen för detta är: Utgångssidan koefficienterna är exakt samma som tidigare . Ingångssidan koefficienter kan lösas så här: Om du vill använda det här filtret bör du själv kunna göra normaliseringen. Jag brukar inte göra det här. Visdomsord Det är lätt att göra ett filter mer effektivt: Dubbel alla poler och nollor. Frekvensresponsen hos det nya filtret är den gamla rutan. Det finns bättre sätt, men det här är det enklaste. Om du sätter en noll på en pol, neutraliserar du båda. En pol utanför enhetens cirkel gör att filtret blir instabilt. En pol på enhetens cirkel kan vrida filtret i en oscillator. Stort antal poler och nollor innebär stort antal kranar. Zeros påverkar inmatningskoefficienterna, polerutgången. Poler och nollor måste ha konjugerade par, för annars får du komplexa filterkoefficienter och följaktligen komplexa utgångssignaler. Med låga r-värden är den mest förstärkta frekvensen inte alltid i samma vinkel med polen på grund av konjugatpolens effekt. Prova att differentiera magnitudsvaret om du vill ha exakt precision. Ett IIR-filter utan poler är ett FIR-filter. 0 r lt 1 gäller alltid. Bandpass med r Läs kapitel IIR-filterdesign med pole-zero-metod. Hack med r Ju högre r, desto smalare är stoppbandet. Lowpass med r Detta kan göras på flera sätt: Ju högre r, desto starkare resonation. Resonant lowpass filter är säkert den mest använda filtertypen i syntetiserare. Allpass med r Highpass med r Impuls, sinc Om du läser om sinc-interpolering i kapitlet Interpolering av samplad ljud vet du att du kan ersätta en enda samplingsstopp (impuls) i samplingsdata med en korrekt utsträckt sinc-funktion. Korrekt sträckt betyder amplitudesinc (t). När du kör en spektrumanalys på en impuls får du ett platt spektrum med övre gräns vid samplerate2, Nyquist-frekvensen. Eftersom impulssync är detta också spektrumet av sinc: Du kan dra slutsatsen att du får sinc-funktionen om du summerar alla frekvenser från 0 till SR2 och dela summan med antalet frekvenser för att uppfylla ekvationen sinc (0) 1. Och du har rätt. Från spektrumanalysen vet du att alla frekvenser summerade tillsammans har samma amplituder. Men vad är deras fas i centrum av impulsen Sinc-funktionen är symmetrisk runt x0, så är cosinus - så sinc måste göras av cosinus. Om du testar detta med cirka 100 kosiner får du en ganska nära approximation av sinc. Summan av alla frekvenser från 0 till 1 (jämförbar med SR2), dividerad med deras antal, kan skrivas som: (Här betyder oändlig) Som ovan, måste x ersättas med pi t, eftersom cyklängden för synden är 2 pi, som måste sträckas till 2 (vilket är våglängden för Nyquist-frekvensen i sampledata). Fasskift Vad händer om vi byter ut cosinuserna med sines Vi kan prova det Theres en universell formel (som, btw, jag uppfann mig) vi kan använda: Om vi ​​ersätter alla impulser i ljudet med den här nya funktionen utför vi faktiskt en -90 graders fasskift Detta kan göras genom att skapa ett FIR-filter, där koefficienterna tas från denna nya funktion: (1-cos (pi t)) (pi t), men i omvänd ordning, genom att ersätta t med - t , så blir det: (cos (pi t) -1) (pi t). Heres ett exempel som förklarar varför det är nödvändigt att använda - t istället för t: Säg att du vill ersätta alla impulser i signalen med sekvensen 1,2,3. Om ingångssignalen är 0,1,0, säger sunt förnuft att den ska bli 1,2,3. Om du bara använder 1,2,3 som filterkoefficienter i den ordningen blir den filtrerade signalen: Det är inte vad du bad om. Men om du använder koefficienterna 3,2,1 får du rätt resultat, Ok, tillbaka till -90 graders fasskiftfilter. När du plockar filterkoefficienterna från (cos (pi t) -1) (pi t), vid t0 får du olyckligtvis en delning med noll. Undvik detta genom att beräkna gränsen t-gt0, på papper eller med en matematisk proggy. Om du använder din hjärna lite märker du att det är 0, eftersom filterformeln är summan av sines och synd (0) 0, så vid t0 är det summan av nollor. Liksom sinc, har vår nya funktion ingen slut, så en kompromiss måste göras i antalet kranar. Detta orsakar vågor i magnitudsvaret och dämpning av de allra lägsta och högsta frekvenserna. Genom att applicera en fönstersfunktion på koefficienterna kan du bli av med vågorna, men jag vet ingenting som skulle hjälpa till med dämpningen, förutom fler kranar. Fönsterfunktionerna som används med FFT fungerar också här. Fönstret i mitten måste ligga vid t0, och det måste sträckas så att kanterna ligger på den första och den sista kranen. Du kan också få en fasskift av någon vinkel a: Observera att omvänd t har redan gjorts här, så vi kan ta koefficienterna direkt från denna formel. Gränsen t-gt0 är naturligt cos (a), eftersom alla cosinuserna som tillsattes tillsammans hade fas a vid x0. Om du inte insett det, är huvudidén i FIR-filterproduktionen att skapa en funktion som innehåller de frekvenser du vill passera filtreringen. Amplituderna av frekvenserna i funktionen definierar direkt filtrets magnitudfrekvensrespons. Faserna av frekvenserna definierar fassvaret. Omvändning av koefficienterna är endast nödvändig med fasskiftande filter, eftersom filter som inte introducerar en fasskift av något slag är symmetriska runt t0. Definiera frekvensområdet ingår Om du använder sinc som din filterkoefficient formel, gör du faktiskt ingen filtrering, eftersom alla frekvenser från 0 till Nyquist presenteras lika i sinc. Här får du se hur du kan välja vilka frekvenser som kommer att finnas i din filterkoefficientformel. Kom ihåg varifrån vi ursprungligen fick sinc från: I integralet representerar den övre gränsen (1x) faktiskt den högsta frekvensen (1) och den nedre gränsen (0x) den lägsta (0). Så om du vill ha en formel för ett bandpassfilter kan du skriva: där topp och botten är cutofffrekvenserna på så sätt att 1 betyder Nyquist-frekvensen och 0 betyder 0Hz. Nu lägger du bara på vilka frekvenser du vill, beräknar och ersätter x med (pi t). Theres din filterkoefficient formel klar Till exempel, om du vill göra ett halvband lowpass filter (som naturligtvis har cutoff frekvens vid samplerate4, samma som Nyquist frekvens 2): För att skapa multi-band filter kan du kombinera flera bandpass filter formler genom att lägga till dem tillsammans. Utjämningsexemplet Om du vill göra en equalizer (ett filter som låter dig definiera storheterna för vissa frekvenser) summerar du förmodligen många bandpassfilterformler, avskalade av de storlekar du vill ha för frekvenssegmenten. Detta ger dig ett storlekssvar som ser väldigt ut som om det var gjord av tegelstenar: Kanske vill du att det ska se ut så här istället: Det finns tre sätt. Det första sättet är att använda mindre tegelstenar, vilket betyder att du delar upp frekvensen i smalare än tidigare segment och använder interpolering för att få storleksvärdena för de nya smala bandpassfiltret som du kombinerar. Det andra sättet är att definiera ett polynom (som ax3bx2cxd) som har de önskade egenskaperna (och där x1 representerar freqSR2), och för att fylla storleken på ditt filter för att följa det. Det här är möjligt. Det tredje sättet är att lägga till flera bandpass rampfilmformler. I storlekssvaret ser denna lösning ut som raka linjer dras mellan de intilliggande definierade frekvenserna. Detta är också möjligt, och enligt min mening den bästa lösningen. Polynomformat magnitudfrekvensrespons I sinc har alla cosinovågor som läggs till tillsammans lika stora amplitud, som du ser här - alla frekvenser behandlas lika: Du kan ändra detta genom att lägga en funktion g () som definierar amplituderna av cosinovågorna av olika frekvenser: Om funktionen g (x) är formulär axb, går beräkningarna så här: För ett enkelt exempel, om vi vill att magnitudfrekvenssvaret ska vara en rak linje, börjar från 0 vid 0Hz och slutar vid 1 vid SR2, definierar vi g (x) x: Och formulärberäkningarna för filterkoefficientens formel för detta: I andra fall, för att få formeln för ett fullständigt polynom, gör beräkningarna för var och en av dess termer (axb) separat och summera resultaten. Bandpass magnitude-ramp Här är ett exempel på magnitudfrekvensresponsen hos ett rampfilter: För att skapa en bandpassramp måste du först definiera polynomet g (x) som beskriver hur storheten beter sig inom bandpassgränserna. Storleken är linjär inom gränserna, så polynomet g (x) måste bildas cxd. C och d kan lösas från ekvationerna: där x1 är den lägre frekvensgränsen och x2 är högre. Y1 och y2 är gränsvärdena för gränsvärdena. Kom ihåg att här x1 är lika med frekvensSR2. OK, här är c ​​och d löst: G (x) cxd är ett polynom, och du vet redan hur man gör att frekvensfrekvenssvaret har samma form (sektion polynomialformat magnitudfrekvenssvar) som ett polynom. Du vet också redan hur man bara ska inkludera ett begränsat frekvensområde (avsnittet Definiera frekvensområdet medföljer) i din koefficientformel. Kombinera denna kunskap, och du kan skriva koefficientformeln för rampbandpassfiltret: En anteckning om genomförande av equalizern. Om equalizern ska kunna justeras i realtid kan det beräknas att hela kompensationsfilterformeln med alla trigonometriska funktioner blir för tung. It may be better to precalculate coefficients for several overlapping filters, for example these for a three-channel equalizer: When calculating the coefficients for the whole equalizer, just pick the corresponding coefficients from these, scale according to the equalizer sliders, and sum. If you take your FIR filter coefficients directly from your filter formula, you get a very wavy magnitude response. The reason is simple: The number of coefficients is limited, but the filter formula is not, it continues having nonzero values outside the range you are using for the coefficients. A windowing function helps. Not using a windowing function is the same thing as using a rectangular ( flat inside its limits) windowing function. Using a windowing function means that you multiply the values taken from your infinitely long filter formula by the corresponding values taken from your finitely long windowing function, and use the results as filter coefficients. Here are some windowing functions, and the produced magnitude responses of a FIR lowpass filter with a low number of taps, illustrated: As you see, the steeper the cutoff, the more waves you get. Also, if wed look at the magnitude responses in dB scale, wed notice that from the three, cos4 gives the best stopband ( the frequency range that should have 0 magnitude) attenuation. Mathematically, multiplication in the time domain is convolution in the frequency domain, and windowing is exactly that. (Also, multiplication in the frequency domain is convolution in the time domain.) I hope i didnt slam too many new words to your face. Time domain means the familiar time-amplitude world, where we do all the FIR and IIR filtering. The frequency domain means the frequency-amplitudeampphase world that you get into through Fourier transformation. And convolution In the time domain, FIR filtering is convolution of the input signal with the filter coefficients. Say you convolute 0,1,0,0,2,0,1,0 with 1,2,3 (where 2 is at the center): Youll get 1,2,3,2,4,7,2,3. If you understand this example, you surely understand convolution too. Ideally (impossible), there would be no windowing, just the constant value 1 infinitely in time. And a steady constant value in the time domain is same as 0Hz in the frequency domain, and if you (in the frequency domain) convolute with 0Hz, it is the same as no convolution. Convolution in the frequency domain equals to multiplication in the time domain, and convolution in the time domain equals to multiplication in the frequency domain. Sounds simple, eh But note that in this frequency domain, there are positive AND NEGATIVE frequencies. Youll learn about those in chapter Positive and negative frequencies. Words of wisdom You get flat (but not necessarily continuous) phase response if your filter (filter coefficients) is symmetrical or antisymmetrical (sides are symmetrical but have opposite signs, and the center crosses zero) around t0, even if you limit the number of coefs andor window them. Sometimes you can optimize your filter code a lot. Some coefficients may turn zero, so you can skip their multiplications. If your filter is symmetrical around t0, you can instead of input(t)ainput(-t)a write (input(t)input(-t))a). If your filter is antisymmetrical around t0, replace input(t)a-input(-t)a) with (input(t)-input(-t))a. Sinc(t) is 1 at t0, and 0 at other integer t values. Calculating the limit t-gt0 is very simple. If your filter formula was originally a sum cosines (meaning its not a phase shift filter), the limit t-gt0 is simply the area of the magnitude frequency response, in such way that the area of no filtering is 1. The actual filter implementation (after possible coefficient calculations) depends much on how the input data is fed to the filter. I can see three cases: You have the whole input data in front of you right when you start. A sample editor is a good example on this. This is the easiest case. With FIR filters, just take values from the input data, multiply with coefficients and sum, like this: output(t) a0input(t-2) a1input(t-1) a2input(t) a3input(t1) a4input(t2). The only problem is what to do at the start and at the end of the input table, because reading data from outside it would only cause problems and mispredictability. A lazy but well working solution is to pad the input data with zeroes, like this: This is how its mostly done with FFT filtering. With FIR filters, it isnt that hard to write a version of the routine that only uses a limited range of its taps, like this: and to use that version at the start and at the end. For this, it is easiest if you have a table of coefficients instead of hard-coding them into the routine. Data is fed to the filter in small chunks, but it is continuous over the chunk borders. This is the most common situation in programs handling realtime audio. One sample at a time. Case 2 can be treated as this, because the chunks can always be chopped into single samples. It is a fact that you cannot use future inputs in this case, so a FIR filter would have to be of form such as: output(t) a0input(t-4) a1input(t-3) a2input(t-2) a3input(t-1) a4input(t). Clearly this kind of a filter creates a delay, but thats just a thing you have to learn to live with. Also, you only get in one sample at a time, which is not enough for filtering, so you have to store the old input values somehow. This is done using a circular buffer. The buffer is circular, because otherwise youd soon run out of memory. Heres a set of pictures to explain the scheme: The buffer must be at least as long as the filter, but it is practical to set the length to an integer power of 2 (In the above example: 2532), because then you can use the binary AND operation to handle pointer wrapping always after increasing or decreasing one (In the above example, AND with 31). Even better, use byte or word instructions, and wrapping will be automatically handled in overunderflows caused by the natural limits of byte or word. Note that the buffer should be filled with zeroes before starting. A similar circular buffer scheme is also often the best solution for implementing the output part of an IIR filter, no matter how the input part was realized. There are both positive and negative frequencies. Until now we havent had to know this, because we have been able to do all the calculations by using sines as frequencies. Dont be fooled that positive frequencies would be sines, and negative ones something else, because that is not the case. In all real (meaning, not complex) signals, positive and negative frequencies are equal, whereas in a complex signal the positive and negative frequencies dont depend on each other. A single sinewave (real) consists of a positive and a negative frequency. So any sine frequency could be expressed as a sum of its positive and negative component. A single, positive or negative, frequency is: and could also be written as: As stated, a sinewave consists of a positive and a negative frequency component. Heres the proof: (The phase of the negative frequency must also be inverted, because it rotates to the other direction) As you see, the imaginary parts nullify each others, and all that remains is the real part, the sine wave. Amplitude of the sine wave is the sum of the amplitudes of the positive and the negative frequency component (which are the same). This also proves that in any real signal, positive and negative frequencies are equal, because a real signal can be constructed of sine waves. The complex Z-plane is a good place to look at positive and negative frequencies: Positive frequencies are on the upper half of the circle and negative frequencies on the lower half. They meet at angles 0 and the Nyquist frequency. Aliasing usually means that when you try to create a sine wave of a frequency greater than the Nyquist frequency, you get another frequency below the Nyquist frequency as result. The new frequency looks like as if the original frequency would have reflected around the Nyquist frequency. Heres an example: The cause of aliasing can be easily explained with positive and negative frequencies. The positive component of the sine wave actually gets over the Nyquist frequency, but as it follows the unit circle, it ends up on the side of negative frequencies And, for the same reasons, the negative component arrives on the side of positive frequencies: The result is a sine wave, of frequency SR-f. Analytic signal It is sometimes needed to first create a version of the original signal that only contains the positive frequencies. A signal like that is called an analytic signal, and it is complex. How does one get rid of the negative frequencies Through filtering It is possible to do the job with an IIR filter that doesnt follow the conjugate-pair-poles-and-zeros rule, but a FIR filter is significantly easier to create. Well use the old formula that we first used to create sinc: but this time, instead of cosines, only including the positive frequencies: As you see, the filter coefficients are complex. We should also halve the amplitude of the positive frequency (it should be half of the amplitude of the cosine, because the negative component is gone) but thats not necessary, because itd only scale the magnitude. To convert the complex analytic signal back to real, just throw away the imaginary parts and all the frequencies get a conjugate (on the z-plane) pair frequency. Here the amplitudes drop to half, but as we skipped the halving in the filtering phase, it is only welcome. The real to analytic signal conversion could also be a good spot for filtering the signal in other ways, because you can combine other filters with the negative frequency removal filter. Amplitude modulation Amplitude modulation means multiplying two signals. All samplepoints in the modulated signal are multiplied by the corresponding samplepoints in the modulator signal. Heres an example: What happens if we modulate a signal with a sinewave The original signal is (as we have learned) a sum of frequecy components, sinewaves of various frequencies, amplitudes and phases. Note that the signal we are talking about here is real, not complex. Say sNUMBER is one of the frequency components. So, we can write the original signal as: Now, if we multiply this signal with the modulator signal m, we get: This is good, because as you see, its the same as if the frequency components were processed separately, so we can also look at what happens to each frequency component separately. A frequency component can be written as: where amp is the amplitude, f the frequency and a the phase. The modulator sine can be written the same way (Only added the letter m): Multiply those and you get: If we discard the phase and amplitude information, we get: which is two frequencies instead of the origial one. Heres a graph that shows how the frequencies get shifted and copied. The original frequency is on the - axis and the resulting frequencyfrequencies on the axis: In the graph Modulated, the frequencies that would seem to go below zero, get aliased and therefore reflect back to above zero. In sampled signal, the Nyquist frequency also mirrors the frequencies. Frequency shifting With some tweaking and limitations, you could make a frequency shifter by using sinewave modulation, but theres a better way. Lets try modulating the signal with e(i mf x) instead of cos(mf x). Phases and amplitudes are irrelevant, so ive just ignored them. (I hope you dont mind) Lets see what happens to a single positivenegative frequency when it is modulated: The answer is very simple. The original frequency got shifted by the modulator frequency. Notice how the rule Multiplication in the time domain is convolution in the frequency domain. applies here also. Heres an example on the z-plane unit circle. p0, p1, p2 are the positive frequencies and n0, n1, n2 their negative conjugate frequencies. Say the modulator frequency rotates the frequencies 14 full cycle counterclockwise: In the modulated signal, the original pair frequencies (like p0 and n0) are no longer conjugate pairs. Thats bad. Another bad thing is that negative frequencies get on the side of positive frequencies and vice versa. But if we first filter all the negative, and those of the positive frequencies that would arrive on the wrong side of the cirle, and then modulate the filtered signal: (The filter formula is in the chapter A collection of FIR filters in section Combined negative frequency removal and bandpass) Now it looks better To make this filtered amp modulated complex signal back to real again, just discard the imaginary part and all the frequencies get a conjugate pair: For most sounds, frequency shifing doesnt do a very good job, because they consist of a fundamental frequency and its harmonics. Harmonic frequencies are integer multiples of the fundamental frequency. After you have shift all these frequencies by the same constant frequency, they no longer are harmonics of the fundamental frequency. There are ways to do scaling instead of shifting, but just scaling the frequencies would be same as resampling, and resampling also stretches the sound in time, so it has to be something smarter. The main idea is to divide the sound into narrow frequency bands and to shiftscale them separately. OK, so frequencies usually come with harmonics - Why Just think where sounds in nature originate from: vocal cords in our throat, quitar strings, air inside a flute. All vibrating objects, and you have probably learned at school that objects have several frequencies in which they like to vibrate, and those frequencies are harmonics of some frequency. What happens in those objects is that they get energy from somewhere (moving air, players fingers, air turbulence), which starts all kinds of vibrationsfrequencies to travel in them. When the frequencies get reflected, or say, go around a church bell, they meet other copies of themselves. If the copies are in the same phase when they meet, they amplify each other. In the opposite phases they attenuate each other. Soon, only few frequencies remain, and these frequencies are all harmonics of same frequency. Like so often in physics, this is just a simplified model. A note about notation. ) The fundamental frequency itself is called the 1st harmonic, fundamental2 the 2nd, fundamental3 the 3rd, and so on. Chromatic scale In music, harmonics play a very important role. The chromatic scale, used in most western music, is divided into octaves, and each octave is divided into 12 notes. The step between two adjanced notes is called a halftone. A halftone is divided into hundred cents. An octave up (12 halftones) means doubling the frequency, an octave down (-12 halftones) means halving it. If we look at all the notes defined in the chromatic scale on a logarithmic frequency scale, we note that they are evenly located. This means that the ratio between the frequencies of any two adjacent notes is a constant. The definition of octave causes that constant12 2, so constant 2(112) 1.059463. If you know the frequency of a note and want the frequency of the note n halftones up (Use negative n to go downwards) from it, the new frequency is 2(n12) times the old frequency. If you want to go n octaves up, multiply by 2n. But why 12 notes per octave As said, harmonics are important, so it would be a good thing to have a scale where you can form harmonics. Lets see how well the chromatic scale can represent harmonics. The first harmonic is at the note itself: 0 halfnotes 1. The second harmonic is at 1 octave 2. The third harmonic is very close to 1 octave 7 halftones 19 halftones 2(1912) 2.996614. Och så vidare. Heres a table that shows how and how well harmonics can be constructed: Not bad at all The lowest harmonics are the most important, and as you see, the errors with them are tiny. I also tried this with other numbers than 12, but 12 was clearly the best of those below 30. So, the ancient Chinese did a very good choice The above table could also be used as reference when tuning an instrument, for example a piano (bad example - no digital tuning in pianos), to play some keys and chords more beautifully, by forcing some notes to be exact harmonics of some other notes. A common agreement is that one of the notes, middle-a, is defined to be at 440Hz. This is just to ensure that different instruments are in tune. Flanger is simply: where d is the length of the variable delay. D values have a lower limit, and the variation comes from sine: Because d is not integer, we must interpolate. Most probably, annoying high frequency hissing still appears. It can be reduced by lowpass filtering the delayed signal. Wavetable synthesis means that the instruments being played are constructed of sampled sound data. MOD music is a well-known example. Also most of the basic home synthesizers use wavetable synthesis. Say you have a sampled instrument, and want to play it at frequency f 440Hz, which is middle A in the chromatic scale. To be able to do this, you need to know A) the samplerate of the sample and the frequency of the sampled instrument, or B) the wavelength of the instrument expressed as number of samples (doesnt have to be integer). So you decide to precalculate the wavelength to speed up the realtime routines a little: The samplerate of your mixing system, SR, is 44100Hz. Now that you know this, you can calculate the new wavelength, the one you want (number of samples): In the mixer innerloop, a sample offset variable is used in pointing to the sampledata. Every time a value is read from the sampledata and output for further mixing, sample offset is advanced by adding variable A to it. Now we must define A so that ol (256) is stretched (here shortened) to nl (100.22727), in other words, so that for ol samplepoints in the sampledata, you produce nl output values: Everything on one line: Thats it By using A as the addvalue, you get the right tone. Click removal There are some situations when unwanted clicks appear in the output sound of a simple wavetable synthesizer: Abrupt volume (or panningbalance) changes. A sample starts to play and it doesnt start from zero amplitude. A sample is played to the end and it doesnt end at zero amplitude. (Biased sampledata or badly cut out sample) A sample is killed abruptly, mostly happens when new notes kill the old ones. Poor loops in a sample. And what does help Heres some advice: Volume changes must be smoothed, maybe ramped, so that itll always take a short time for the new volume to replace the old. Clicky sample starts can be muffled, meaning that the volume is first set to zero and then slided up. This could of course be done beforehand too, and some think muffling sample starts is wrong, because the click may be deliberate. Some drum sounds lose a lot of their power when the starts are muffled. Another case is when the playing of a sample is not started from its beginning. That will most probably cause a click, but muffling is not the only aid - starting to play from the nearest zero crossing also helps. Abrupt sample ends should also be faded down. This may require some sort of prediction, if you want to fade down the sound before its ran over by another sound. This prediction can be made by using a short information delay buffer. It may be easier to just use more channels, to allow the new sound to start while the other one is being faded out in the background, on another channel. When the sampledata ends at a value other than zero, the cause may be that the sampledata is not centered around the zero level, or that the creator of the sample has just cut the end of the sample away. The easiest way to fix this is to fade out the end of the sample beforehand. However, this is not always possible. Symmetric form Turning an IIR filter backwards Getting rid of output(tn) Getting rid of input(tn) FIR frequency response IIR frequency response. Olli wrote he tried to make his text as down-to-earth as possible. Well, heres a more mathematical approach. But Ive still tried to make this intuitive and FUN rather than boring myself with lengthy proofs. This also means that there may be errors, most probably in signs. Symmetric form Say you have this IIR filter: You can put its equation to this symmetric form: Now define a new function, middle(t): You can rewrite this as: Notice how the transition from input(t) to middle(t) is a FIR filter and the transition from output(t) to middle(t) is another. So the IIR filter in fact consists of two FIR filters facing each other. This gives a simple approach to frequency response calculations (see the section IIR frequency response). Turning an IIR filter backwards You can solve input(t) from the IIR equation: Now swap input and output and you have a filter that undoes what the original did. But if the frequency response of the original filter was ZERO for some frequency, the inverted one will amplify that frequency INFINITELY. This is just logical. The inverted filter will also have an opposite phase shift, so that if R(f) is the frequency response of the original filter as a complex number and r(f) is the frequency response of the inverted filter, R(f)r(f)1 for every f. Getting rid of output(tn) Say you have somehow found that you need an IIR filter like this: You need to know both output(t2) and output(t-2) to be able to compute output(t). Doesnt seem very practical. But you can shuffle the equation a little: Now define a new variable ut2 and use it instead of t: Then solve output(u): Now you can use the filter. Getting rid of input(tn) Notice how in the previous example, input(t) became input(u-2). Had there been input(t1), it would have become input(u-1) which can be used in real time filters. Generally, you can get rid of input(tn) this way if the equation also uses output(tm) where mn, because you can define utm which turns input(tn) to input(u-(m-n)) which you get in time. If mltn, this is not possible: Here m0 and n1, so you cant get rid of input(t1) and keep the filter mathematically equivalent to the original. However, you can delay the output by one time unit: Usually, this small delay doesnt matter. But it changes the phase frequency response of the filter and this DOES matter if you then mix the filtered signal with the original one or others derived from it in that case, youd better make sure that all of the signals have the same delay. (Except if you happen to like the extra effect.) (For example, if you have a filter output(t)input(t-1), it doesnt do much as such. But if you mix the filtered signal with the original one, the mixing becomes a filter in itself and you can compute its frequency response and all.) If you try to force the original filter through the utm trick by introducing a dummy 0output(t1) term: youll just get division by zero. FIR frequency response Treat a sine wave as a rotating phasor e(it2piffs) where: The real component of this phasor is the regular sine wave. The neat thing about this is that you can multiply it with various complex numbers to scale the magnitude and shift the phase at the same time. By defining ze(i2piffs), the phasor can be written as zt. This is the same z that is used in pole-zero calculations (see chapter IIR filter design using pole-zero method). Heres the general FIR equation: Now, lets look what the filter does to an infinitely long sine wave with frequency f. But this sine wave can be replaced with the rotating phasor if we then throw away the imaginary component of the output. m(k) is real so the real and imaginary components cant affect each other. Here the zt factor doesnt depend on k, so it can be moved outside the sum: z depends on f (ze(i2piffs), remember) but the value of the sum doesnt depend on t. Ill call it R(f): output(t) is a rotating phasor at the same frequency as input(t) it just has a different amplitude and phase as defined by R(f). This means that for an infinitely long sine wave of frequency f, R(f) shows how the filter affects its amplitude and phase. In other words, R(f) is the frequency response of the filter. Its a complex function. If you dont remember what this means, see section Complex math with filters in chapter Whats a filter in this file. IIR frequency response When two filters are concatenated so that one filters output is fed to the other filters input, the responses are multiplied at each frequency: A filter that just connects its input to its output and doesnt change the signal at all has a frequency response of 1 at all frequencies: Now assume that we have a filter with frequency response R(f) and we make another filter with frequency response Rinv(f) that UNDOES everything the first filter did to the signal when they are concatenated. So the inverse filter also has an inverse frequency response. Remember, an IIR filter consists of two FIR filters facing each other (see section Symmetric form). This setup can be treated as a normal FIR filter followed by an inverted FIR filter: This means that if you can calculate the frequency responses of the two FIR filters, you can calculate the IIR frequency response by dividing one with the other. An example. You have this IIR filter. Change the names of functions a little: Compute the frequency response of filter input1-gtoutput1 (originally input-gtmiddle). The general formulas: In this particular case: The input2-gtoutput2 (originally output-gtmiddle) filter: Now the whole IIR: To actually calculate the frequency response at some frequency, youd apply Eulers formula and the usual complex number rules: R in the filters means resonance, steepness and narrowness. Fastest and simplest lowpass ever Fast lowpass with resonance v1 19 Comments raquo Thanks for posting this. It8217s a nice collection of audio DSP nuggets. May I suggest that the URL at the top of the original text document (iki. fiodspdspstuff. txt ) be pointed directly to this page. Comment by ColdCold 8212 2009-11-16 16:06 Thanks Mate, Greatly appreciate this tutorial. DSP in simple terms is not easy to come by on the Web Comment by Don 8212 2010-05-10 04:29 Thanks a lot. Very useful concepts explained in a lucid manner. Comment by Ravi 8212 2010-08-30 14:59 Hi, About notch filter.. Why I can8217t get the frequency cut effect Sample rate:1600 freq 1950 q 0.1 z1x cos(2pifreqsamplerate) a0a2 ((1-q)(1-q))(2(fabs(z1x)1)) q a1 -2z1xa0a2 b1 2z1xq b2 -(qq) 8212821282128212- frequency: 1950.000000 q: 0.100000 z1x: 0.195090 a0a2: 0.438887 a1: -0.171245 b1: 0.039018 b2: -0.010000 Each sample calculation: 82128212821282128212821282128212821282128212821282128212 reg0 a0a2 ((double)samplecurrentsampleminus2) a1sampleminus1 b1reg1 b2reg2 reg2 reg1 reg1 reg0 82128212821282128212821282128212821282128212821282128212 Is it correct Output is clean voice, but 1950Hz carrier is still there. BR Comment by Alexander Vangelov 8212 2011-03-16 22:46 Freq should be between 0 and samplerate2. (Just a quick comment before I go to bed) Comment by Olli Niemitalo 8212 2011-03-17 00:53 Thank you, it works :) I missed a zerro digit in parametters (just before I go to bed) Sample rate: 16000 Freq: 1950.000000 q: 0.400000 z1x: 0.720854 a0a2: 0.504599 a1: -0.727484 b1: -0.576683 b2: 0.160000 Comment by Alexander Vangelov 8212 2011-03-17 10:43 Very good tutorial, thanks Comment by Vadim 8212 2011-10-11 19:42 man, this is the best introduction (covering all topics) into DSP I stumbled upon perhaps I do have a chance to pass the exam. D sorry, for a double post. but8230 can you attest everything is correct for example, 822082218221 You can use any number of poles and zeros, but they must all have 8220conjugate pairs8221, if they are not positioned on the 8220-8221 axis. 822082218221 is this true I8217m playing with applets that allow for poles without conjugate pairs and seemingly band-pass filters (with regard to the magnitude response) can be built this way. can you please explain ( laps. fri. uni-lj. sidpsarhivappletiisipsystemv4.0srcapplet. html ) Doug, it is true, IF you want the filter to have a real output, not complex. If you make a bandpass with just one pole, and have the pole so close to the unit circle that the filter output is pretty much a single frequency, then the output of the filter will be a complex phasor rotating in one direction on the complex plane. If you switch the sign of the imaginary part of the position of the pole then you get as output a phasor that rotates in the opposite direction. If you have poles in both of those positions, then the output must contain both of those complex phasors in equal parts, thus the imaginary parts of the phasors cancel each other. So you get as output a real sinusoid. Good luck with the exam Comment by Olli Niemitalo 8212 2011-12-27 13:41 This is the first cogent explanation of poles and zeros that I have ever received. I feel better and worse at the same time, if you know what I mean. In any case. THANK YOU Comment by Mark McConnell 8212 2012-05-09 01:12 8230 Yehar8217s Digital Sound Processing Tutorial for the Braindead 8230 Nice Job Men82308230. I found it very helpful. tack. Can you put implementation of audio effects in computer. Comment by Trnform3r 8212 2012-09-16 10:07 Sure, for example as a VST effect. Comment by Olli Niemitalo 8212 2012-09-16 22:14 This is fantastic nice work and a very well explanation of DSP. Thank you :D Comment by tor 8212 2013-02-16 01:42 Thank you so much for this informative writing on the subject which makes life much easier since no-where could I find any book on the subject which makes it as clear as you did here. Keep it going and thank you again. Comment by FJ Botha 8212 2015-02-21 10:14 Frickin delicious Seriously, i thank people like you for simply existing and count my blessings that i found this brilliant introduction you created. The note takingoutline is digestable in one bite and it will stick with me during my upcoming solo winter sound holiday to the pampa and magellians strait, the large uninhabited Falkland rock, and if im still alive - christmas island. Dec to Feb. I hope to capture enough sound to keep me glazed and deadeyed until black metal villians capture Oslo Comment by Mick Dkaye 8212 2016-10-18 19:13 And love that Black Deck. Masonna weeps Comment by Mick Dkaye 8212 2016-10-18 19:16 Leave a comment

No comments:

Post a Comment