medelvärde av en signal?
medelvärde av en signal?
Jag har en periodisk signal och vill skapa ett medelvärde av t.ex. dom senaste 20 perioderna så att man blir av med brus och små variationer
(man skapar alltså 1 period genom medel av 20)
Någon som vet någon funktion i program som t.ex. Matlab eller annars kanske bara namn på filter som skulle kunna fixa detta?
funktionen finns ju i t.ex. oscilloskop så det måste ju finnas algoritmerna för det tycker man
(man skapar alltså 1 period genom medel av 20)
Någon som vet någon funktion i program som t.ex. Matlab eller annars kanske bara namn på filter som skulle kunna fixa detta?
funktionen finns ju i t.ex. oscilloskop så det måste ju finnas algoritmerna för det tycker man
Vad är det du vill göra? Vill du sampla en periodisk signal och representera den som en "vektor" men få bort brus?
Vad har du för förkunskaper om signalen? (frekvens, vågform osv)
T.ex om du vet att signalen kan vara 1147Hz till 4711Hz så kan du använda ett fir eller iir bandpassfilter som täcker in det frekvensområdet.
Om du vet att det t.ex. är en sinusvåg kan kan du interpolera fram nollgenomgångar och maximala värden. För de tjugo senaste perioderna och sedan medelvärdesbilda periodtid och amplitud för att skapa din nya signal. Detta förutsätter väl dock att signale är rätt statisk.
När du pratar om oscilloskop så ska de ju återge signalen period för period. Då kan det vara värt att läsa på om DA-omvandling generellt. Du lär stöta på något som kallas sinc-funktionen. Den kan vara lite opraktisk i verkliga livet eftersom den har en oändlig bandbredd, men det finns modifierade sinc-funktioner som är lättare att tillämpa.
Du kanske vill interpolera data för att fylla ut mellan dina samples och få en snygg kurvform, då kan du använda olika interplationsmetoder. Sök t.ex. på splines eller kubisk interpolation.
Om du vill efterlikna ett oscilloskop kan du kanske "trigga" vid ett visst värde och sedan medelvärdesbilda över 20st sådana "triggnings-perioder"
osv ...
Vad har du för förkunskaper om signalen? (frekvens, vågform osv)
T.ex om du vet att signalen kan vara 1147Hz till 4711Hz så kan du använda ett fir eller iir bandpassfilter som täcker in det frekvensområdet.
Om du vet att det t.ex. är en sinusvåg kan kan du interpolera fram nollgenomgångar och maximala värden. För de tjugo senaste perioderna och sedan medelvärdesbilda periodtid och amplitud för att skapa din nya signal. Detta förutsätter väl dock att signale är rätt statisk.
När du pratar om oscilloskop så ska de ju återge signalen period för period. Då kan det vara värt att läsa på om DA-omvandling generellt. Du lär stöta på något som kallas sinc-funktionen. Den kan vara lite opraktisk i verkliga livet eftersom den har en oändlig bandbredd, men det finns modifierade sinc-funktioner som är lättare att tillämpa.
Du kanske vill interpolera data för att fylla ut mellan dina samples och få en snygg kurvform, då kan du använda olika interplationsmetoder. Sök t.ex. på splines eller kubisk interpolation.
Om du vill efterlikna ett oscilloskop kan du kanske "trigga" vid ett visst värde och sedan medelvärdesbilda över 20st sådana "triggnings-perioder"
osv ...
Aha, förstod inte vad du ville (läste inte parantesen). Du vill alltså få fram en signal som är en period lång, som är formad som "medelsignalen" under 20 perioder?
Vet inga färdiga funktioner, men det borde gå att lösa med några loopar.
Först en loop som identifierar var i datan perioderna startar och slutar. Sedan skala om dem så att alla är lika långa som medellängden och innehåller lika antal samplingar. Sedan addera varje sample från varje period och till sist dividera varje summa med antalet perioder.
Fast det kanske tar en stund att skriva den koden...
Vet inga färdiga funktioner, men det borde gå att lösa med några loopar.
Först en loop som identifierar var i datan perioderna startar och slutar. Sedan skala om dem så att alla är lika långa som medellängden och innehåller lika antal samplingar. Sedan addera varje sample från varje period och till sist dividera varje summa med antalet perioder.
Fast det kanske tar en stund att skriva den koden...
signalen kommer från att en pump pumpar vätska genon en slang, i slangen har jag en trycksensor, trycksensor signalen samplar jag sedan och efter detta i datorn vill jag skapa en fin period av att ta medelvärdet på typ 20
Tyvärr så är signalen inte särskilt statisk eller sinusliknande utan den varierar ganska mycket i amplitud och form på ett sätt som verkar vara slumpmässigt, därför är det svårt att synthetisera en likadan bara med sinusvågor
Ett bandpass använder jag redan eftersom signalen är relativt smalbandig i frekvensplanet men den varierar fortfarande mycket enligt ovan så det räcker inte
min plan har först varit att klippa ut 20 hela perioder och addera dessa punkt för punkt och dividera med 20 och få ut medelvärdet i varje punkt...men det visade sig att varje period är 754,7 sampel lång, och eftersom man inte kan klippa ut annat än hela sampel så blir det en förskjutning hela tiden och det blir inte jämna perioder. Därför har jag inte lyckats lösa det på det sättet men jag tycker det borde gå...nån som kommer på en lösning?
Att trigga vid en viss nivå blir också konstigt eftersom signalen är ganska skum i sin form..en viss nivå i y-led ger liksom ibland en vändpunkt i kurvan och ibland mitten på en flank
kan det här med interpolation vara intressant tror du babbage nu när du vet mer om signalen?
Tyvärr så är signalen inte särskilt statisk eller sinusliknande utan den varierar ganska mycket i amplitud och form på ett sätt som verkar vara slumpmässigt, därför är det svårt att synthetisera en likadan bara med sinusvågor
Ett bandpass använder jag redan eftersom signalen är relativt smalbandig i frekvensplanet men den varierar fortfarande mycket enligt ovan så det räcker inte
min plan har först varit att klippa ut 20 hela perioder och addera dessa punkt för punkt och dividera med 20 och få ut medelvärdet i varje punkt...men det visade sig att varje period är 754,7 sampel lång, och eftersom man inte kan klippa ut annat än hela sampel så blir det en förskjutning hela tiden och det blir inte jämna perioder. Därför har jag inte lyckats lösa det på det sättet men jag tycker det borde gå...nån som kommer på en lösning?
Att trigga vid en viss nivå blir också konstigt eftersom signalen är ganska skum i sin form..en viss nivå i y-led ger liksom ibland en vändpunkt i kurvan och ibland mitten på en flank
kan det här med interpolation vara intressant tror du babbage nu när du vet mer om signalen?
Det du först skriver att du vill göra fixas enkelt med(periodmedelvärde):
mean(reshape(insignal,periodlängd,antal perioder)) % Med reservation för att dimensionen är fel.
Att förlänga signalen så den blir ett jämnt antal perioder är tråkigare, men nått i stil med:
k = (signalen([2:end 1])-signalen)./10 % Interpolationssteglängden, linjär interpolation
utsignal = repmat(signalen,10,1)+(repmat(k,10,1).*(cumsum(ones(10,length(signalen)))-1))
Så får du en matris med vektorn i rad ett, de interpolerade värdena i kolumnen. Observera att sista kolumnen är helt uppåt väggarna fel; men det går eventuellt att anta något om signalen och få ut riktiga värden där också.
för att få en vektor av det: reshape(utsignal,1,length(utsignal))
hoppas det hjälper
mean(reshape(insignal,periodlängd,antal perioder)) % Med reservation för att dimensionen är fel.
Att förlänga signalen så den blir ett jämnt antal perioder är tråkigare, men nått i stil med:
k = (signalen([2:end 1])-signalen)./10 % Interpolationssteglängden, linjär interpolation
utsignal = repmat(signalen,10,1)+(repmat(k,10,1).*(cumsum(ones(10,length(signalen)))-1))
Så får du en matris med vektorn i rad ett, de interpolerade värdena i kolumnen. Observera att sista kolumnen är helt uppåt väggarna fel; men det går eventuellt att anta något om signalen och få ut riktiga värden där också.
för att få en vektor av det: reshape(utsignal,1,length(utsignal))
hoppas det hjälper
kan du utveckla jag förstår inte hur du menar?BEEP skrev:Jag hade nog löst problemet rent fysiskt genom att sätta dit en strypning och en ackumulator (liten tank) på slangen till sensorn.
problemet är nu delvis löst..genom att interpolera så förlängde jag perioderna så det blev det blev ett heltal sampel per period
men nu till nästa bekymmer..i vissa fall så har jag även adderat en svagare signal med annan frekvens än grundsignalen, om jag medelvärdes bildar genom att ta hela perioder av grundsignalen och ta medel på dom så blir jag ju av med den lilla signalen eftersom den har en annan periodtid....går det att lösa tror ni?
finns det verkligen inga färdigskrivna funktioner eller filter som löser detta istället för att man skriver egna algoritmer?
jag kanske kommer in lite sent i tråden, men..
Ska du analysera signalen med avseende på vissa delsignaler eller söker du speciella särdrag? Du letar ju tydligen även efter en svag signal med en avvikande frekvens som finns överlagrad i den starkare.
Ett klassiskt sätt att studera innehållet i en signal är att använda någon transform och flytta den från tidsplanet till exempelvis frekvensplanet. Då kan du få en uppfattning av vilka frekvenser som finns representerade i den (längre) tidsperiod du har samlat in. FFT kan vara ett väldigt användbart verktyg.
Ett sätt att minska ner bruset, som ofta kan ha högre frekvenser än den sökta signalen, är att exempelvis nyttja Wavelet-filtrering. Wavelet-transformen kan även ge en hel del information om signalen, men resultatet kan vara svårtolkat.
Ett mer avancerat sätt att undersöka signalen är att dela upp den i amplitud och faskomponenter och försöka skaffa sig en bild av vad som händer i respektive område. En periodisk signal kan i en del fall även justeras med subsampelsteg genom att vrida fasen innan en medelvärdesbildning görs med den komplexa (IQ-uppdelade) signalen.
Vill du ha ut två specifika signaler med olika amplitud och frekvens kan du titta på en i taget och betrakta den andra som brus. Alla oönskade signaler är ju att betrakta som störning eller brus.
Det finns med andra ord ett antal olika sätt att angripa problemet beroende på vad du egentligen vill ha ut i slutänden.
Hur hög sampelfrekvens har du jämfört med de frekvenser som den ingående signalen har?
Ska lösningen vara generell för fler olika pumpar eller bara för denna? Jag skulle tro att olika pumpar kommer att ge olika signal då en del variationer kan uppstå beroende på mekaniska variationer i pumparna.
Jag hoppas att ovanstående inte är en allt för deprimerande läsning, men som sagt lösningen beror lite på vad som söks.
Sen tycker jag att BEEP;s RC-filter med en tank och strypventil är ett elegant sätt att få bort högfrekventa förändringar.
Ska du analysera signalen med avseende på vissa delsignaler eller söker du speciella särdrag? Du letar ju tydligen även efter en svag signal med en avvikande frekvens som finns överlagrad i den starkare.
Ett klassiskt sätt att studera innehållet i en signal är att använda någon transform och flytta den från tidsplanet till exempelvis frekvensplanet. Då kan du få en uppfattning av vilka frekvenser som finns representerade i den (längre) tidsperiod du har samlat in. FFT kan vara ett väldigt användbart verktyg.
Ett sätt att minska ner bruset, som ofta kan ha högre frekvenser än den sökta signalen, är att exempelvis nyttja Wavelet-filtrering. Wavelet-transformen kan även ge en hel del information om signalen, men resultatet kan vara svårtolkat.
Ett mer avancerat sätt att undersöka signalen är att dela upp den i amplitud och faskomponenter och försöka skaffa sig en bild av vad som händer i respektive område. En periodisk signal kan i en del fall även justeras med subsampelsteg genom att vrida fasen innan en medelvärdesbildning görs med den komplexa (IQ-uppdelade) signalen.
Vill du ha ut två specifika signaler med olika amplitud och frekvens kan du titta på en i taget och betrakta den andra som brus. Alla oönskade signaler är ju att betrakta som störning eller brus.
Det finns med andra ord ett antal olika sätt att angripa problemet beroende på vad du egentligen vill ha ut i slutänden.
Hur hög sampelfrekvens har du jämfört med de frekvenser som den ingående signalen har?
Ska lösningen vara generell för fler olika pumpar eller bara för denna? Jag skulle tro att olika pumpar kommer att ge olika signal då en del variationer kan uppstå beroende på mekaniska variationer i pumparna.
Jag hoppas att ovanstående inte är en allt för deprimerande läsning, men som sagt lösningen beror lite på vad som söks.
Sen tycker jag att BEEP;s RC-filter med en tank och strypventil är ett elegant sätt att få bort högfrekventa förändringar.
exakt vad jag har och söker är följande:
jag har en signal som är samplad med 1kHz och består av följande:
dels en pumpsignal som har en grundfrekvens som är antingen 1,2 eller 3Hz och genom FFT ser jag också tydliga övertoner på 2f,3f,4f os.v. Amplituden peak till peak i tidsplanet varierar mellan 30-40
Grundfrekvensen kan jag samtidigt plocka ut från maskinen så den behöver inte mätas
Överlagrat på pumpsignalen finns en signal från annan källa som också har frekvens som ligger i 1-3Hz intervallet men som jag inte känner till, amplituden på denna signal är ca 30ggr mindre än den stora
Grunduppgiften är att ta reda på om den lilla överlagrade signalen plötsligt försvinner
Jag har även tillgång till den starka signalen utan den lilla överlagrad, men om jag mäter denna så kan jag inte vid samma tidpunkt mäta den som innehåller båda
att lösa uppgiften genom en enkel subbtrahering fungerar därför inte eftersom signalerna är allt annat än fint statiskt periodiska så man kan inte rakt av ta ett antal perioder från en tidspunkt och använda för att få bort den starka signalen från en mätning innehållande båda signalerna
Därför är min plan att använda ett adaptivt system, en adaptive noise canceller.
In i detta vill jag ha:
1.en medelvärdesbildad insignal som innehåller båda signalerna
2.En medelvärdesbildad referenssignal som bara innehåller den starka signalen
Genom att subbtrahera dessa 2 och skicka in differensen i en LMS algoritm som uppdaterar ett filter genom vilket jag skickar referens signalen så ska jag få ut endast den svaga signalen
Så tillbaka till min ursprungliga fråga som är:
Hur gör jag för att medelvärdesbilda signaler kontinuerligt över t.ex. dom senaste 20 perioderna om dom innehåller överlagrade signaler med olika periodtider?
jag har en signal som är samplad med 1kHz och består av följande:
dels en pumpsignal som har en grundfrekvens som är antingen 1,2 eller 3Hz och genom FFT ser jag också tydliga övertoner på 2f,3f,4f os.v. Amplituden peak till peak i tidsplanet varierar mellan 30-40
Grundfrekvensen kan jag samtidigt plocka ut från maskinen så den behöver inte mätas
Överlagrat på pumpsignalen finns en signal från annan källa som också har frekvens som ligger i 1-3Hz intervallet men som jag inte känner till, amplituden på denna signal är ca 30ggr mindre än den stora
Grunduppgiften är att ta reda på om den lilla överlagrade signalen plötsligt försvinner
Jag har även tillgång till den starka signalen utan den lilla överlagrad, men om jag mäter denna så kan jag inte vid samma tidpunkt mäta den som innehåller båda
att lösa uppgiften genom en enkel subbtrahering fungerar därför inte eftersom signalerna är allt annat än fint statiskt periodiska så man kan inte rakt av ta ett antal perioder från en tidspunkt och använda för att få bort den starka signalen från en mätning innehållande båda signalerna
Därför är min plan att använda ett adaptivt system, en adaptive noise canceller.
In i detta vill jag ha:
1.en medelvärdesbildad insignal som innehåller båda signalerna
2.En medelvärdesbildad referenssignal som bara innehåller den starka signalen
Genom att subbtrahera dessa 2 och skicka in differensen i en LMS algoritm som uppdaterar ett filter genom vilket jag skickar referens signalen så ska jag få ut endast den svaga signalen
Så tillbaka till min ursprungliga fråga som är:
Hur gör jag för att medelvärdesbilda signaler kontinuerligt över t.ex. dom senaste 20 perioderna om dom innehåller överlagrade signaler med olika periodtider?
ha en buffer för typ 2048 punkter (eller vad du nu vill ha, beror ju på samplingshastigheten och periodtiden) samt 2 pekare för en cirkulär-buffer. Sen flyttar du över datan till frekvensrummet med FFT (på det sättet slipper du problem med triggning, är dock orginal signalens SNR väldigt dåligt så kommer kräva väldigt många medelvärdesbildningar) och kör X medelvärdesbildningar, det ger en SNR förbättring med en faktor sqrt(X)... detta kommer dock kräva en del beräkningskraft om du tänkt göra det med något inbyggt system.