Sekvenssikonvoluutio on kahden numeerisen sekvenssin lineaarinen muunnos . Konvoluution tuloksena saadaan sekvenssi, jonka alkiot saadaan kertomalla ja summaamalla alkuperäisten sekvenssien alkiot siten, että yhden sekvenssin jäsenet otetaan kasvavilla indekseillä ja toisen jäsenet - laskevilla indekseillä (mikä palvelee tämän operaation hyväksytyn nimen perustaksi). On olemassa lineaarisia ja syklisiä konvoluutioita, joita käytetään äärellisille ja jaksollisille sekvensseille, vastaavasti.
Sekvenssien ja konvoluutio on merkitty nimellä .
Järjestystaitto on toimintotaiton erikoistapaus . Konvoluutio liittyy myös läheisesti ristikorrelaatioon .
Perinteisiä nipputyyppejä ovat:
Harkitse kunkin konvoluutiotyypin laskemisen sääntöjä ja järjestystä.
Olkoon kaksi numeerista sarjaa:
Näiden sekvenssien lineaarisen konvoluution laskemiseksi sinun on suoritettava seuraavat vaiheet:
Suorittamalla kaikki yllä kuvatut toiminnot saadaan lineaarinen konvoluutio sarjoista ja , joiden elementit lasketaan kahdesta kaavasta:
tai
Tässä oletetaan, että , vastaavan sekvenssin elementit ovat nolla.
Voit varmistaa kaavojen vastaavuuden ja sen seurauksena konvoluutiooperaation kommutatiivisuuden yksinkertaisesti korvaamalla indeksit yhdessä kaavoista.
Tarkastellaan nyt kahta samanpituista numeerista sarjaa :
Jaksottaisen ympyräkonvoluution saamiseksi on välttämätöntä kuvitella, että nämä sekvenssit sijaitsevat kahdella ympyrällä, joista toinen on toisen sisällä. Kunkin näiden sekvenssien arvot ovat yhtä kaukana toisistaan. Ympyräkonvoluution jokaisen arvon saamiseksi on välttämätöntä kuvitella, että yksi sarjoista liikkuu ympyrässä suhteessa toiseen myötäpäivään. Ensin otetaan pyörivän sekvenssin ensimmäinen arvo, kerrotaan peräkkäin toisen sekvenssin arvoilla ja lasketaan yhteen kertolaskujen tulokset ja saadaan tulossekvenssin ensimmäinen arvo . Sitten toistamme nämä toimet kullekin sekvenssin arvolle, joka pyörii suhteessa toiseen. Lähtösekvenssin elementtien lukumäärä on .
Toisin sanoen syklisen konvoluution alkiot lasketaan kaavalla
missä .
Tuloksena oleva sekvenssi vastaa kahden jaksollisen signaalin, toisin sanoen sekvenssien, konvoluutiota, ja sen voidaan katsoa olevan määritelty kaikille kaavoilla ja .
Ajajaksoisen konvoluution saamiseksi suoritetaan kaikki samat toiminnot kuin ympyräkonvoluution saamiseksi, mutta sarjoissa voi olla eri määrä elementtejä (esimerkiksi ja ) ja ne on täytettävä nollilla . Tämän tyyppistä konvoluutiota suoritettaessa pyöreän kierteen yhteydessä esiintyvän pyöreän päällekkäisyyden vaikutus eliminoidaan. Tämä on vaihtoehtoinen tapa laskea lineaarikonvoluutio.
Edellä kuvattu lähestymistapa mahdollistaa yhteyden muodostamisen lineaaristen ja syklisten konvoluutioiden laskennan välille. Tätä varten jaamme syklisen konvoluution elementtien kaavassa summan kahdella, mikä vastaa tapauksia ja :
Olettaen nyt ensimmäisessä summassa kohdassa ja toisessa summassa at , voimme muuttaa summausrajoja ja saada lineaaristen ja syklisten konvoluutioiden välisen suhteen muodossa
Lineaarinen konvoluutio voidaan laskea sykliseksi, jos tämän kaavan toinen termi on yhtä suuri kuin nolla, eli tulot kaikille ja ovat yhtä suuret kuin nolla . Tämän ehdon täyttymisen varmistamiseksi voidaan valita syklisen konvoluution pituus siten, että se ei ole pienempi kuin , samalla kun syötesekvenssit täytetään nolilla.
Konvoluution laskemiseksi diskreetin Fourier-muunnoksen avulla on tarpeen täyttää molemmat tulosekvenssit nollilla siten, että näiden sekvenssien elementtien lukumäärä on yhtä suuri kuin . Seuraavaksi on tarpeen suorittaa suorat Fourier-muunnokset jokaiselle sekvenssille. Sitten muunnetut sekvenssit kerrotaan elementti kerrallaan, minkä jälkeen suoritetaan kertolaskutuloksen käänteismuunnos.
Konvoluution laskeminen kuvatulla tavalla on mahdollista konvoluutiolauseen ansiosta.
Lineaarisen, syklisen tai konvoluution laskelmien oikeellisuuden tarkistamiseksi Fourier-muunnoksen avulla voit lisäksi laskea toisen kahdesta muusta konvoluutiotyypistä, koska lähtösekvenssien on oltava samat, kun tulosekvenssit ovat samat.
Konvoluution laskeminen vaatii operaatioita. Tätä lukua voidaan vähentää merkittävästi laskemalla konvoluutio erilaisilla nopeilla algoritmeilla.
Useimmiten operaatioiden määrän vähentämiseksi konvoluutio lasketaan käyttämällä kahta Fourier-muunnosta, joista kukin lasketaan käyttämällä nopeita algoritmeja . Tämä vähentää konvoluutiooperaation laskennallisen monimutkaisuuden arvoon .
Olkoon kaksi diskreettiä kompleksista signaalia avaruudessa . Määritämme näiden signaalien konvoluution seuraavasti
Asetetaan myös tilan koon pienentäminen mittaamalla tai summaamalla signaali asteikolla
Lause. Satunnaiselle avaruuden ulottuvuudelle konvoluution ja sitä seuraavan summauksen tulos on , mikä vastaa alustavaa signaalien summausta ja sitä seuraavaa konvoluutiota: . [yksi]
Alla on esimerkki lineaarisen konvoluution toteutuksesta, joka on kirjoitettu C++ :lla:
/* * Lähtösekvenssin koko on M + N - 1 */ vektori < double > conv ( const vektori < double >& x , const vektori < double >& h ) { if (( x . koko () == 0 ) && ( h . koko () == 0 )) { paluuvektori < double > ( ); } vektori < kaksois > a ; vektori < kaksois > b ; if ( x .size ( ) < h .size ( ) ) { a = x _ b = h _ } muu { a = h _ b = x ; } vektori < double > tulos ( a . koko ( ) + b . koko ( ) - 1 , 0 ); for ( koko_t k = 0 ; k < a . koko (); k ++ ) { for ( koko_t l = 0 ; l < b . koko (); l ++ ) { tulos [ l + k ] += a [ k ] * b [ l ]; } } palauttaa tuloksen ; }