AUDIO SPECTRUM ANALYZER MET GELUIDSKAART EN
SOFTWARE GESCHREVEN IN PYTHON

(2011)

CLICK HERE FOR THE ENGLISH VERSION


Het audio spectrum analyzer programma.

Audio spectrum analyzer met geluidskaart en software geschreven in Python
Deze audio spectrum analyzer heeft een correcte dB schaal. Je kunt er dus echte metingen mee doen. Met zo'n audio spectrum analyzer kun je bijvoorbeeld de audio karakteristiek van je CW of SSB filter van je ontvanger meten. Sluit daarvoor een HF generator aan op de ontvanger. Zet de trace op Max hold en draai de frequentie van de HF generator langzaam over de ontvangstfrequentie. En je zult de audio karakteristiek zien verschijnen. Maar je krijgt ook al een heel aardige indruk door de trace op Average te zetten en ruis te ontvangen via de antenne. De Average functie laat een gemiddelde van het ruisniveau zien. En deze gemiddelde ruis komt ook overeen met de audio karakteristiek. Op deze manier kun je ook goed een kristal filter afregelen.
Ook kun je de zijband onderdrukking meten. Sluit daarvoor een HF generator aan op de ontvanger. Zet de trace op Max hold en draai de frequentie van de HF generator langzaam over de gewenste zijband. Sla deze trace op. Reset de trace door deze even op Normal te zetten. Zet de trace weer op Max hold en draai de frequentie van de HF generator langzaam over de onderdrukte zijband. Het verschil tussen de nu getoonde trace en de opgeslagen trace is de zijband onderdrukking.
En heb je een eenvoudige directe conversie ontvanger zonder automatische sterkte regeling, dan kun je zien hoeveel een signaal varieert door bijvoorbeeld fading.


Probe voor de geluidskaart. Voor kleine signalen kun je R1 verlagen
tot 10k of 1k. R2 kun je verhogen of zelfs weglaten.

Probe voor de spectrum analyzer
Een eenvoudige probe met een 1M ohm impedantie kun je zelf maken. Voor kleine signalen kun je R1 verlagen tot 10k of 1k. R2 kun je verhogen of zelfs weglaten. De diodes zitten erin om de ingang van de geluidskaart te beveiligen tegen sterke signalen.

Wat doet een FFT window?
In mijn oude spectrum analyzer programma in Visual Basic, werd geen FFT window (geen FFT window wordt ook wel Rectangular window genoemd) toegepast. Hier kun je een aantal FFT windows kiezen. Maar wat is een FFT window en wat doet het? Het principe is heel eenvoudig. We lezen een aantal samples van de geluidskaart en zetten die in een rij. Voor de FFT berekening moet dat een macht van 2 zijn, bijvoorbeeld 2048. Zonder window leveren alle samples hun maximale bijdrage aan de FFT berekening. Je zou dan ook het meest optimale resultaat verwachten, maar dat is niet zo.
Een FFT window verzwakt de samples aan het begin van de sample rij en aan het eind. Naar het midden toe wordt de verzwakking geleidelijk minder. Het middelste sample wordt niet verzwakt. Maar vanaf het midden tot aan het eind van de sample rij neemt de verzwakking weer toe. De samples aan het begin en aan het eind van een sample rij doen dus nauwelijks of helemaal niet meer mee! Waarom zouden een groot deel van de samples maar half gebruiken of zelfs helemaal niet? En er zijn zelfs FFT windows waarvan sommige samples de andere samples tegenwerken! De reden waarom een FFT window wordt toegepast kun je hieronder op de verschillende plaatjes van diverse FFT windows bekijken. Geen FFT window (ook wel Rectangular window genoemd), veroorzaakt heel veel zijbanden in het spectrum. Dat kun je op het eerste plaatje heel goed zien. Zwakke signalen in de buurt van het hoofdsignaal worden daardoor onzichtbaar. Het dynamisch bereik is dus gering. Door het toepassen van een FFT window worden de zijbanden veel meer onderdrukt, de mate daarvan is afhankelijk van het type FFT window. Wel gaat dat onderdrukken van die zijbanden ten koste van de selectiviteit. FFT windows met een hele hoge onderdrukking van de zijbanden en dus een groot dynamisch bereik, hebben aanzienlijk minder selectiviteit. Een Cosine window is een prima compromis tussen goede selectiviteit en een goed dynamisch bereik, zeer goed bruikbaar voor een QRSS baken ontvangst programma. Een bijzonder filter is het Flat top filter. Het heeft een platte top. Daardoor is het prima geschikt voor nauwkeurige niveau metingen. De piek van het signaal hoeft dan niet precies in de piek van het FFT filter te liggen.

Geen window (ook wel Rectangular window genoemd) genereert heel veel zijbanden.
Zwakke signalen vlak naast het signaal zijn daardoor onzichtbaar geworden.
Het dynamisch bereik is dus gering.
Een Cosine window heeft al een vrij behoorlijke zijband onderdrukking en
de selectiviteit blijft uitstekend. Een prima compromis tussen een goed
dynamisch bereik en een goede selectiviteit.

Een Blackman window heeft een hoge zijband onderdrukking en dus een groot dynamisch bereik.
Zwakke signalen vlak naast het signaal zijn goed zichtbaar, maar door
de grotere bandbreedte is de selectiviteit minder goed.
Een Flattop window is een bijzonder filter. Het heeft een vlakke top.
Door de vlakke top is het zeer geschikt voor nauwkeurige niveau
metingen maar heeft het wel een grote bandbreedte.


En hier het Rectangular (of geen) window en het eenvoudige Cosine window in een
plaatje zodat je de verschillen nog eens duidelijk kunt zien (10 dB per divisie).

Zero Padding
Onder de menu knop "Setup" kun je niet alleen de sample rate van de geluidskaart kiezen, maar ook een factor voor de Zero Padding. Wat is het probleem dat met behulp van Zero Padding moet worden opgelost? De bandbreedte van het FFT filter is afhankelijk van de keuze van het FFT window. Van een smal FFT filter is de bandbreedte ongeveer net zo groot als het frequentie verschil tussen 2 FFT frequentie punten. Wanneer het signaal precies tussen 2 FFT frequentie punten ligt, zal het signaal niveau te laag worden weergegeven doordat het niet precies in de top van de FFT filterkromme ligt, maar op de flank van het FFT filter. Dit kun je heel goed zien in het linker plaatje hieronder. Het signaal ligt precies tussen de twee FFT frequentie punten in. De piekwaarde die tussen de twee samples in ligt, is gelijk aan de bovenste witte lijn, maar de weergegeven waarde van beide samples liggen veel lager. Het juiste signaal niveau wordt dus door geen van beide FFT frequentie punten goed weergegeven, de fout is zelfs meer dan 3dB! Dit noemen ze Scalloping loss.

Geen zero padding. Zero padding.

Zero Padding is de oplossing voor dit probleem. We gaan de FFT berekening een beetje voor de gek houden. Voor 1x Zero Padding maken we de FFT sample rij 2x zo lang. Was de oorspronkelijke rij 2048 samples, dan voegen we er 2048 samples met de waarde NUL aan toe en krijgen we een rij met 4096 samples. Wat een onzin, wanneer we nullen toevoegen, voegen we helemaal geen extra meetdata toe! Toch gebeurt er iets in de FFT berekening met 2x zoveel samples. Het effect kun je in het rechter plaatje zien. Er wordt namelijk een extra FFT frequentie punt toegevoegd! Toevallig valt deze hier precies samen met de frequentie van het signaal en wordt het niveau van het signaal gelijk goed weergegeven. Maar ook wanneer de frequentie van het signaal niet precies op het extra FFT frequentie punt valt, wordt de meetfout al veel kleiner. Omdat we samples met de waarde nul toevoegen, blijft de bandbreedte van het FFT filter gelijk. In dit programma kun je voor de Zero Padding een getal kiezen tussen 0 en 5. Omdat het een macht van 2 is, is het dus een getal tussen 1 en 32. Er worden dan 0x - 31x zoveel punten toegevoegd. Wel duurt de FFT berekening dan maximaal 32x zo lang en wordt de audio spectrum analyzer erg traag. Een extra punt (dus een waarde van 1 voor de Zero Padding) is al prima om de Scalloping loss acceptabel te houden. En wat je ook nog kunt doen, is geen Zero Padding toepassen, maar een Flat top window kiezen. De platte top is zo breed, dat je zelfs zonder Zero Padding geen Scalloping loss hebt. Maar dan heb je ook minder selectiviteit.

De menu knoppen
Hieronder volgt een uitleg van de menu knoppen. Alle functies zijn ondergebracht onder knoppen, er zijn geen schuifbalken, draaiknoppen of drop down menu's toegepast.

Normal mode, Max hold, Average
In Normal mode wordt de trace continue vernieuwd.
In Max hold, wordt steeds de maximale waarde onthouden. Is de nieuwe waarde hoger, dan wordt de trace op dat punt vernieuwd.
In Average mode worden de trace waarden uitgemiddeld. Zo kun je bijvoorbeeld met ruis een curve maken van de audio karakteristiek van een ontvanger.

FFT window
Hiermee kun je een FFT window kiezen. Zoals uitgelegd, het is beter om niet een "Rectangle window" oftewel geen window te kiezen. Dit window heeft een slecht dynamisch bereik vanwege de hoge zijbandruis die met zo'n window in de FFT berekening wordt gegenereerd.
Een flat top window geeft de hoogste nauwkeurigheid, maar ook een grote bandbreedte, dus wat minder selectiviteit.

Store trace
Spreekt voor zich, hiermee kun je een trace opslaan.

Screen setup
Hiermee kun je het aantal divisions van het scherm kiezen. Ook kun je er kleinere schermen mee kiezen. Kan handig zijn wanneer je kleinere spectrum analyzer plaatjes wilt maken voor documentatie of een website.

Audio on/off
Wanneer je mee wilt luisteren met het signaal. Maar wanneer je een mogelijkheid om direkt via de geluidskaart en het daarop aangesloten sound system mee te luisteren, kun je die beter gebruiken.

Setup
Hiermee kun je de sample frequentie van de geluidskaart kiezen. Hoe hoger de sample frequentie, hoe hoger het frequentie bereik zal zijn. De sample frequentie van de geluidskaart is vaak een standaard waarde zoals 44100, 48000, 96000 en 192000 Hz. Maar je zult merken dat je ook allerlei andere waarden kunt ingeven voor de sample frequentie en dat die ook goed werken. Hoe kan dat? In Windows zit een routine ingebakken die de sample frequentie van de geluidskaart converteert naar je gewenste sample frequentie. Door middel van interpolatie worden de waardes van de samples berekend uit die van de geluidskaart zijn verkregen.
Ook kun je in het setup menu de gewenste Zero Padding factor (macht van 2) ingeven.

Start en Stop
Start en stop toetsen voor de trace.

Startfreq en Stopfreq
Hiermee kun je de begin- en eindfrequentie van het scherm selecteren.

LVL toetsen
Hiermee kun je het niveau oftewel de gevoeligheid wijzigen.

dB/div
Hiermee kun je het aantal dB's per divisie instellen.

Samples
Hiermee kun je het aantal samples voor de FFT berekening wijzigen. Dit getal moet een macht van 2 zijn. Veel samples geeft een hoge resolutie, maar een langzame update tijd van de trace. Weinig samples geeft een lage resolutie, maar een snellere update tijd van de trace.

Versie SpectrumAnalyzer-v01b.py
In plaats van signalen van de geluidskaart van de PC kan het programma nu ook WAV files inlezen. Deze optie is bruikbaar wanneer de frequentie karakteristieken van WAV files moeten worden weergegeven. Let op! Voordat het decoderen begint, wordt eerst de WAV file ingelezen. Dit kan heel lang duren, het lijkt dan alsof er niets gebeurt. De variabele WAVinput (regel 77) moet op 1 gezet worden in plaats van 0 om de WAV mode te activeren.

Versie SpectrumAnalyzer-v01c.py
Er is een mogelijkheid om de trace als een .CSV file op te slaan [frequentie,dBlevel], een idee van Jack Lindsay. Het scherm is vergroot en de conversie routine van dB's naar schermpixels is geoptimaliseerd.

Versie SpectrumAnalyzer-v02a.py
De snelheid is verbeterd, hoofzakelijk door het vervangen van enkele routines door Numpy routines. En een tijd / datum tekst is toegevoegd aan de file naam wanneer de trace als een .CSV file [frequentie,dBlevel] wordt opgeslagen.

Versie SpectrumAnalyzer-v04a.py
Deze versie is geschikt voor Python versie 3 en 24 bits WAV files.


SOFTWARE

Voordat je dit programma gebruikt, moet je Python installeren. Dit gaat heel eenvoudig. Maar lees eerst eens iets over Python door op de volgende link te klikken:

WAT IS PYTHON EN HOE INSTALLEER JE PYTHON

Omdat de broncode van Python in ASCII geschreven is, kun je zelf het programma eenvoudig aanpassen aan je eigen wensen. Denk bijvoorbeeld aan de grootte van het scherm, de kleuren enz.

Benodigde Python versie:

Benodigde externe modules (site-packages voor de juiste Python versie!):

Download hier het Python spectrum analyzer programma door op onderstaande link te klikken:


Index PA2OHH