Sekvenssien konvoluutio

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 9. marraskuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 4 muokkausta .

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 .

Taittotyypit

Perinteisiä nipputyyppejä ovat:

Konvoluutiolaskenta

Harkitse kunkin konvoluutiotyypin laskemisen sääntöjä ja järjestystä.

Lineaarinen konvoluutiolaskenta

Olkoon kaksi numeerista sarjaa:

Näiden sekvenssien lineaarisen konvoluution laskemiseksi sinun on suoritettava seuraavat vaiheet:

missä:  on lähtösekvenssin elementtien lukumäärä;  on ensimmäisen sekvenssin elementtien lukumäärä;  on elementtien lukumäärä toisessa sekvenssissä;

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.

Syklisen konvoluution laskenta

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 .

Aperiodisen konvoluution laskenta

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.

Lineaaristen ja syklisten konvoluutioiden välinen suhde

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 laskeminen Fourier-muunnoksen avulla

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.

Laskennallinen monimutkaisuus

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 .

Avaruuden ulottuvuuden pienentäminen moniulotteisella konvoluutiolla

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]

Ohjelmaesimerkki

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 ; }

Katso myös

Muistiinpanot

  1. Grishentsev A. Yu., Korobeinikov A. G. Avaruuden ulottuvuuden pienentäminen digitaalisten signaalien korreloinnin ja konvoluution aikana  // Izv. yliopistot. Instrumentointi. : painettu. - 2016. - Nro 3 . - S. 211-218 . — ISSN 0021-3454 . Arkistoitu alkuperäisestä 12. toukokuuta 2016.

Kirjallisuus

  • Rabiner L., Gould B. Luku 2. Lineaaristen diskreettien järjestelmien teoria // Digitaalisen signaalinkäsittelyn teoria ja sovellus. - M .: Mir, 1978. - S. 72-81. — 848 s.
  • Blahut R.Nopeat digitaaliset signaalinkäsittelyalgoritmit. - M.: Mir , 1989.