Sekvensfaltning är en linjär transformation av två numeriska sekvenser . Resultatet av faltningen är en sekvens vars element erhålls genom att multiplicera och summera elementen i de ursprungliga sekvenserna på ett sådant sätt att medlemmarna i en sekvens tas med ökande index, och medlemmarna i den andra - med minskande (vilket tjänar som grund för det accepterade namnet på denna operation). Det finns linjära och cykliska faltningar, som används för ändliga respektive periodiska sekvenser.
Konvolutionen av sekvenser och betecknas som .
Sekvensvikning är ett specialfall av funktionsvikning . Konvolution är också nära relaterat till korskorrelation .
De traditionella typerna av buntar inkluderar:
Tänk på reglerna och sekvensen för beräkning av varje typ av faltning.
Låt två numeriska sekvenser ges:
För att beräkna den linjära faltningen av dessa sekvenser måste du utföra följande steg:
Som ett resultat av att utföra alla operationer som beskrivs ovan får vi en linjär faltning av sekvenserna och , vars element beräknas med en av två formler:
eller
Här antas det att för , elementen i motsvarande sekvens är lika med noll.
Du kan verifiera ekvivalensen av formlerna och, som ett resultat, kommutativiteten för faltningsoperationen genom att helt enkelt ersätta indexen i en av formlerna.
Betrakta nu två numeriska sekvenser av samma längd :
För att få en periodisk cirkulär faltning är det nödvändigt att föreställa sig att dessa sekvenser är belägna på två cirklar, varav den ena är inuti den andra. Värdena för var och en av dessa sekvenser är lika långt från varandra. För att erhålla varje värde på den cirkulära faltningen är det nödvändigt att föreställa sig att en av sekvenserna rör sig i en cirkel i förhållande till den andra i medurs riktning. Ta först det första värdet av sekvensen som roterar, multiplicera successivt med värdena för en annan sekvens och summera resultatet av multiplikationerna och få det första värdet av utdatasekvensen . Sedan upprepar vi dessa åtgärder för varje värde i sekvensen som roterar i förhållande till det andra. Antalet element i utdatasekvensen kommer att vara .
Med andra ord, elementen i den cykliska faltningen beräknas med formeln
var .
Den resulterande sekvensen är ekvivalent med faltningen av två periodiska signaler, det vill säga sekvenserna och kan betraktas som definierade för alla av formlerna och .
För att erhålla en aperiodisk faltning utförs alla samma operationer som för att erhålla en cirkulär faltning, men sekvenserna kan ha ett annat antal element (till exempel och ) och de måste fyllas med nollor till antalet . När man utför denna typ av faltning elimineras effekten av cirkulär överlagring, som inträffar med cirkulär faltning. Detta är ett alternativt sätt att beräkna linjär faltning.
Det ovan beskrivna tillvägagångssättet gör det möjligt att upprätta ett samband mellan beräkningen av linjära och cykliska faltningar. För att göra detta, i formeln för elementen i den cykliska faltningen delar vi summan med två, motsvarande fallen och :
Om vi antar nu i den första summan vid , och i den andra summan vid , kan vi ändra summeringsgränserna och få ett samband mellan linjära och cykliska faltningar i formen
Linjär faltning kan beräknas som cyklisk om den andra termen i denna formel är lika med noll, det vill säga produkterna för alla och är lika med noll . För att säkerställa att detta villkor är uppfyllt kan man välja längden på den cykliska faltningen så att den inte är mindre än , samtidigt som man fyller ut inmatningssekvenserna med nollor.
För att beräkna faltningen med hjälp av den diskreta Fouriertransformen är det nödvändigt att fylla båda inmatningssekvenserna med nollor så att antalet element i dessa sekvenser är lika med . Därefter är det nödvändigt att utföra direkta Fourier-transformationer av var och en av sekvenserna. Därefter multipliceras de transformerade sekvenserna element för element, varefter den inversa transformationen av multiplikationsresultatet utförs.
Beräkningen av faltningen på det beskrivna sättet är genomförbar tack vare faltningssatsen.
För att kontrollera korrektheten av beräkningar av en linjär, cyklisk eller faltning med Fourier-transformen kan du dessutom beräkna en av de andra två typerna av faltning, eftersom utgångssekvenserna måste vara lika när ingångssekvenserna är desamma.
Att beräkna en faltning kräver operationer. Detta antal kan reduceras avsevärt genom att beräkna faltningen med olika snabba algoritmer.
Oftast, för att minska antalet operationer, beräknas faltning med två Fourier-transformer, som var och en beräknas med hjälp av snabba algoritmer . Detta minskar beräkningskomplexiteten för faltningsoperationen till .
Låt två diskreta komplexa signaler och ges i rymden . Vi definierar faltningen av dessa signaler som
Låt oss också ställa in operationen för att minska utrymmets dimension genom att mäta eller summera signalen över som
Sats. För en godtycklig dimension av rymden är resultatet av faltning följt av summering över , vilket motsvarar preliminär summering över signaler och efterföljande faltning: . [ett]
Nedan är ett exempel på implementering av linjär faltning, skrivet i C++ :
/* * Utdatasekvensstorleken är M + N - 1 */ vektor < double > conv ( const vektor < double >& x , const vektor < double >& h ) { if (( x . storlek () == 0 ) && ( h . storlek () == 0 )) { returvektor < dubbel > ( ); } vektor < dubbel > a ; vektor < dubbel > b ; if ( x .size () < h .size ( ) ) { a = x _ b = h _ } annat { a = h _ b = x ; } vektor < dubbel > resultat ( a . storlek () + b . storlek () - 1 , 0 ); för ( storlek_t k = 0 ; k < a . storlek (); k ++ ) { för ( storlek_t l = 0 ; l < b . storlek (); l ++ ) { resultat [ l + k ] += a [ k ] * b [ l ]; } } returnera resultat ; }