GNU Octave - THD

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7200
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

GNU Octave - THD

Inlägg av psynoise »

MathWorks MATLAB har en väldigt trevlig funktion thd som plottar spektrum och beräknar THD.

https://se.mathworks.com/help/signal/ref/thd.html

Dock skulle jag vilja köra något liknande i GNU Octave men hittar inget. Känner ni andra till någon färdig funktion eller paket som kan beräkna THD?
guckrum
Inlägg: 1832
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: GNU Octave - THD

Inlägg av guckrum »

Nej tyvärr. Den funktionen verkar ju lite "magisk" iom att den tar inputs på flera vis osv. Antagligen skall du lösa en specifik uppgift, så det är kanske inte så komplicerat att skriva en funktion för just det fallet själv?
ghu
Inlägg: 673
Blev medlem: 6 juni 2010, 14:28:18

Re: GNU Octave - THD

Inlägg av ghu »

Du kan ju använda funktionen fft.
Sedan är det ju inte så svårt att göra en egen funktion för att beräkna THD
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7200
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: GNU Octave - THD

Inlägg av psynoise »

Nja, jag misstänker att det finns en del att tänka på. MATLAB-dokumentationen nämner modified periodogram och Kaiser window. Min gissning är att det används för att få tonen och harmonierna att skala likt. (Nu har var det väldigt många år sedan jag studerade FFT men helt rätt fram vill jag minnas att det inte är för icke ideala signaler.)

Just nu har jag ingen specifik uppgift utan är mest nyfiken över vilka möjligheter som finns i GNU Octave.
guckrum
Inlägg: 1832
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: GNU Octave - THD

Inlägg av guckrum »

Alltid svårt med generella lösningar, och det är inte säkert att thd() funkar "perfekt" i alla fall heller.

Har du tex en ordentligt lång sekvens kan du ju bara ta ett hög resp lågpassfilter för att dela upp i grundton och övertoner, och sedan beräkna dessa energier separat. Är signalen lång kanske du kan klippa så att du får ett helt antal perioder och slipper hålla på med fönstring om det inte känns bra. Då kan du också köra FFT utan fönster. Lite slappt ingenjörsmässigt så där... En annan fråga är ju hur många värdesiffror du behöver i svaret. Det kan ju ge en ledtråd till hur noggrann metoden behöver vara.
ghu
Inlägg: 673
Blev medlem: 6 juni 2010, 14:28:18

Re: GNU Octave - THD

Inlägg av ghu »

"Modified periodogram" är väl bara data efter fönstring med Kaiser-fönstret?
Kaiser fönster finns i Octave.

Om datainsamlingen sker under ett helt antal perioder får man inga diskontiniteter och därmed behöver man inte använda någon fönsterfunktion för att minska läckaget.
SvenW
Inlägg: 1143
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: GNU Octave - THD

Inlägg av SvenW »

Exempel eftersom octave-kod kan vara lite udda

Kod: Markera allt

% testsignal
ra=1:10000;
a= exp(3+sin(0.01*2*pi*ra));
plot (ra,a);

% fouriertransformera 
s = fft(a);
plot(abs(s));
 pause(1)

% plocka ut deltonerna
maxtab = (1:5)*0;
for k = (1:5)
     ra2= ( (100*k-10): (100*k+10)) ;
     ss = s(ra2);
     plot(ra2 , abs(ss') );   % Obs fnuttarna för transponering av matris eller vektor 
     maxtab(k)=max(abs(ss));
     pause(1)
endfor

  % summera för de första övertonerna   
 thd= sum( (maxtab(2:5) .^ 2)) / maxtab(1) .^ 2  % Obs punkterna vid skalärberäkning
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7200
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: GNU Octave - THD

Inlägg av psynoise »

Tack. Det blir säkert bra inspiration. Om jag får ork någon dag borde jag spela in någon riktig audiodata och se om man kan knåpa ihop ett skript som fungerar mer generellt. Sedan hade det väl egentligen också varit okej om man matar manuellt in frekvens för grundtonen efter som vi kan använda en viss tolerans.

Däremot får jag läsa på mer om fönsterfunktioner för att bli mer självsäker med FFT.
SvenW
Inlägg: 1143
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: GNU Octave - THD

Inlägg av SvenW »

Ja, antingen fönsterfunktioner eller en bättre sammanvägning än bara max() ovan.
Tror att det räcker med en rms- sammanvägning av kanalerna kring topparna i spektrum,
men jag får nog också läsa på lite för att vara riktigt trovärdig.
Det klarnar nog om man leker, funderar och läser på. Mycket finns på Wikipedia
Kanske är det någon här som har svaret.
Skriv svar