Python: Hjälp med funktion och skapa mjukvaru-peak detector

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av Magnus_K »

Hmm jo, det lät lite "enklare". Får se om jag har psyke nog att jämföra utvärdena från dom två olika metoderna.
Jobbar fortfarande hårt med rvl:s metod. Blir svettigt när allt från hårdvara, IDE och språk är nytt. Även inklusive kod som ligger högt ovan för min nivå.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av Magnus_K »

lillahuset skrev:Varför krångla till det?
Sampla signalen till en hyfsat stor buffer.
Räkna ut medelvärdet och subtrahera från värdena.
Kvadrera värdena, dividera med antalet värden och dra roten ur.
För att bryta ner det här lite, och förhoppningsvis förstå:

Sampla signalen till en hyfsat stor buffer.
Här ska jag alltså ta mina 25 samplingar och placera dessa in en array/tabell?

Räkna ut medelvärdet och subtrahera från värdena.
Slå ihop samtliga värden i tabellen och dividera med (i detta fall) 25. Sedan gå igenom tabellen och subtrahera värdet med varje sample?
Resultatet blir att mjukvarumässigt filtrerar DC-biasen.

Kvadrera värdena, dividera med antalet värden och dra roten ur.
Här är jag helt förlorad. Här ska jag alltså slå ihop alla "rena" värden ur tabellen, kvadrera, för att sen dividera dessa med 25 (för att få medelvärde). Avslutningsvis dra roten ur för att "invertera" kvadreringen.

Hur nära är jag? Och varför denna kvadrering/roten ur av värdet?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av lillahuset »

Jag missade ett litet steg.

Sampla signalen till en hyfsat stor buffer.
Här ska jag alltså ta mina 25 samplingar och placera dessa in en array/tabell?
Nja, satsa på så lång tid som möjligt som är bekvämt. Ju fler perioder desto noggrannare. Säg 40 perioder eller så. Eller helst en potens av två som storlek på buffern för att minimera overhead för beräkningarna.

Räkna ut medelvärdet och subtrahera från värdena.
Slå ihop samtliga värden i tabellen och dividera med (i detta fall) 25. Sedan gå igenom tabellen och subtrahera värdet med varje sample?
Resultatet blir att mjukvarumässigt filtrerar DC-biasen.
Japp.

Kvadrera värdena, dividera med antalet värden och dra roten ur.
Här är jag helt förlorad. Här ska jag alltså slå ihop alla "rena" värden ur tabellen, kvadrera, för att sen dividera dessa med 25 (för att få medelvärde). Avslutningsvis dra roten ur för att "invertera" kvadreringen.
Det var här jag missade en liten detalj. Du ska beräkna kvadraten för varje sample, summera alla kvadrater, dividera med antalet och slutligen dra roten ur summan. "Root Mean Square", roten ur medelvärdet av kvadraterna eller RMS.

https://en.wikipedia.org/wiki/Root_mean_square
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av Magnus_K »

Sitter och kör min Paj via någon slags "remote desktop" som heter TightVNC Viewer och lyckas fasen inte kopiera mellan den desktop:en och windows-desktop:en.
Lite oproffsigt så klippte jag ut koden som den ser ut nu. Detta är alltså ett försök med lillahuset:s version.

Resultatet pendlar fortfarande upp och ner en aning men det beror antagligen på att jag inte trimmat in SPI-klockan än.
Det här med interrupts på RPi verkar inte vara helt självklart så vet inte hur jag ska anpassa samplingen till en sinuskruvan, förutom att fräsa data med matchande frekvens med 50Hz.

Dock så ligger utvärdet för högt. Det pendlar mellan 17-19 (ADC-bananer) och det bör ligga på 0 nu när jag inte mäter något.

Ser ni något uppenbart tok nedan?

EDIT: Meckade lite mer med SPI-klockan samt ändrade alla for-loopar till range(31) istället. Värdet är super-stabilt men alldeles för högt nu. Uppåt 58 i ADC-värde.
EDIT2: Nollan ligger ganska mycket för lågt. Det kan vara det som ställer till det i slutändan. Jobbar vidare.
Kod.JPG
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av lillahuset »

Ju längre du samplar deso mindre blir felet av att samplingen inte är perfekt. Oftast.

Bry dig inte om att synka ADC-klockan mot 50Hz, sampla så fort du kan och så länge du har råd och räkna på det sedan. Om du har gott om sample spelar det ganska liten roll att du missar sample när RPi gör något annat. Tänk på att du har massor av minne och ~700 miljoner instruktioner att använda per sekund. Det här är en av de stora tjusningarna med DSP, smaska till med CPU och minne. Sedan när man har skaffat sig större förståelse för problemet är det dags att förfina algoritmen och försöka få något vettigt uträttat också.

32 sample känns alldeles för lite. Välj lämplig multipel av 1024. Om du bara har en cykel (gissning) av 50Hz kommer du med stor sannolikhet få en tröttsam offset.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av Magnus_K »

Ja det är fasen vilket pulver det var i den här lille krabaten.

Det börjar bli riktigt roligt nu, men har ett par detaljer kvar att lösa.
Upptäckte att samplingen sker alldeles för tätt. Med en default SPI-klocka på 500'000kHz och 24 bitar/sample, så innebär det en samplingshastighet av ~21ksps (kilo sample per second). En sampling tar (om jag räknar rätt) ca 48µs.

Gör jag 1024 samplingar direkt efter varandra så har jag bara täckt en period på ~50ms, alltså typ 2,5 sinus-perioder.

I det här läget så kan jag nu alltså välja mellan att öka antal samplingar drastiskt eller lägga in en liten delay mellan varje sampling.
Av någon anledning gav det senare alternativet ett bättre resultat, och även ett tillfredsställande resultat.

Frågan lyder, i nuläget la jag in sleep(0.001) mellan varje sampling men är det verkligen bäst metod?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av lillahuset »

Jag tycker du ska börja med att sampla så mycket som möjligt.
Användarvisningsbild
rvl
Inlägg: 5721
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av rvl »

Om jag samplar så mycket som möjligt, så får jag ungefär en period av 50 Hz, innan RAM minnet blir fullt. :mrgreen:
1×12-bit, 2.4 MSPS A/D converter: up to 16 channels
up to 96 Kbytes of SRAM
Har tillsvidare bara testat mycket långsammare och sänt samplen vidare till PC över USB.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: Python: Hjälp med funktion och skapa mjukvaru-peak detec

Inlägg av Magnus_K »

Njoo, har ju inga direkt tidskrav på det här. Kanske var det som hände tidigare, när jag samplade något fruktansvärt många gånger? Dvs att RAM-minnet vart fullt?

I alla fall. Lycklig så jag kan gråta :D Titta här ska ni få se!

Först ut, barnförbjudna testriggen. En tillverkad förlängningssladd där isoleringen är avskalad så pass att jag kommer åt att clampa nolla eller fas.
Har använt mig av en julljusstake och en brödrost som mätobjekt. Notera vad multimetern står på i nedan bild. Det var inte avsiktligt, men lite häftigt.
Testrigg.jpg

När jag mätte ljusstaken med multimetern så gick det ca 88mA, vilket stämmer ganska bra då lamporna blir 21W.
Min hallonpaj mätta denna till 93mA vilket är mycket mer än godkänt för så här låga nivåer.

Brödrosten var specad till 730-870W och med 231V i uttaget så skulle det ge ~ 3,16 - 3,76 A.
Denna mätte jag sedan upp och resultatet syns nedan. Dock är mätningarna gjorda med några minuters mellanrum så diffen kan bero på att elementet i brödrosten var olika varmt, eller något.
Det jag menade ovan med att ni skulle notera vad multimetern stod på när den bara mätte brus, ta en kik på vad strömproben säger innan jag slår på brödrosten.
Mätvärde.jpg
Kod.JPG
Vad ska jag säga? Super stort tack till all tid ni lagt ner! Det kommer säkert komma in fler huvudbryn men nu ska jag bara snygga till koden och lägga till dom två andra faserna, sen får denna del av koden anses vara klar.

EDIT: Testade även med vattenkokare nu. 7,75A med multimetern och 7,78 med pajen. 30mA skillnad med så olika mättekniker måste ju ändå anses som väldigt bra.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar