VERBETERDE AUDIO SPECTRUM ANALYZER
MET GELUIDSKAART

(2012)

CLICK HERE FOR THE ENGLISH VERSION


De oranje lijn is de spectrum weergave van de oude versie van het programma.
De groene lijn is de spectrum weergave van de nieuwe versie van het programma.

Audio spectrum analyzer met geluidskaart
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.


Om de verbeteringen goed te zien is het frequentie gebied sterk verkleind.
De oranje lijn is de weergave van een signaal door de oude versie.
De groene lijn is de weergave van de nieuwe verbeterde versie.

Verbeteringen
Het oorspronkelijke programma was geschreven in Visual Basic 6, maar is nu herschreven in Microsoft Visual Basic 2008 dat gebaseerd is op het universele Microsoft NET Framework. Dat hoef je allemaal niet te weten. Maar wel dat het oude programma een aantal tekortkomingen had. Die zijn opgelost door Zero Padding en een FFT window toe te passen.

Zero padding
Zoals je ziet geeft de oranje lijn van de oude versie niet het maximum aan. Dit komt omdat de frequentie van het signaal precies tussen twee FFT punten in valt. Dit is de zogenaamde "Scalloping Loss" en kan wel zo'n 3 dB zijn. Maar de groene lijn geeft wel het goede niveau aan. Dit is opgelost door Zero padding toe te passen. De oorspronkelijke FFT audio sample reeks van 1024 punten wordt verdubbeld tot 2048 of zelfs verviervoudigd tot 4096 door deze aan te vullen met allemaal nullen oftewel zeroes. Hierdoor worden er tijdens de FFT berekening extra punten ingevoegd tussen de oorspronkelijke twee en wordt het maximum veel nauwkeuriger weergegeven. Eenmaal Zero padding oftewel een verdubbeling van het aantal FFT samples door 1024 nullen toe te voegen, is al voldoende voor onze toepassingen.

FFT window
Maar je ziet nog een verbetering. Bij de oranje lijn van de oude versie heeft het signaal heel sterke zijbanden. Deze ontstaan in de FFT berekening en kan worden opgelost door een FFT window toe te passen. In de groene lijn van de nieuwe versie is een FFT window toegepast en zijn deze zijbanden heel zwak. Wel meer dan 60 dB zwakker dan de oranje lijn van de oude versie! Helaas gaat dit ten koste van de selectiviteit. Maar die selectiviteit kun je weer verbeteren door een 2x langere FFT sample reeks te kiezen (2048 in plaats van 1024).


In het oude programma is geen FFT window toegepast.
Alle audio samples gaan onverzwakt in de FFT berekening.

Wat is een FFT window
Een FFT window is een heel simpele bewerking. De audio samples van de FFT reeks worden verzwakt volgens een bepaalde curve. De audio samples in het midden worden niet verzwakt. Die aan het begin en eind het meest en daartussen in hangt het geheel af van welke curve wordt toegepast. De vorm van de verzwakkingscurve bepaalt wat voor een soort window het is. Hieronder is dat het Nuttall window dat toegepast wordt om een groot dynamisch bereik te verkrijgen. De bandbreedte is 2.02 FFT samples, dus 2x groter dan wanneer je geen FFT window toepast.
Door het toepassen van FFT window wordt het audio signaal niet meer ineens aan- en uit geschakeld, maar gaat het geleidelijk van nul naar zijn maximum en daarna weer geleidelijk naar nul.


Een FFT window is een heel simpele bewerking. De audio samples van
de FFT reeks worden verzwakt volgens een bepaalde curve.

Andere FFT windows
Voor diverse toepassingen zijn er windows te kiezen, het "High selectivity" window is een zogenaamd Cosine window en het "Flat top " window heeft een vlakke, brede top. Omdat er Zero padding wordt toegepast, kun je zien dat de zijbanden ook dippen bevatten. Zonder Zero padding zijn deze niet zichtbaar en worden de pieken van de zijbanden door de trace lijn verbonden. In onderstaande plaatjes kun je de verschillende effecten van de windows bekijken (groene kleur). Het standaard "High dynamic range" filter is oranje gekleurd te zien. Het simpele Cosine filter heeft nauwelijks minder selectiviteit dan de oude spectrum analyzer zonder FFT window en al een 20 dB betere onderdrukking van de zijbanden.

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 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.

Een Cosine window is een prima compromis tussen goede selectiviteit en een goed dynamisch bereik, ook zeer goed bruikbaar voor een QRSS baken ontvangst programma. Een bijzonder window is het Flattop window. Het verkregen filter heeft een vlakke 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. Het doorzwiepen van een audio filter kun je het beste met dit window doen.

De menu knoppen
Hieronder volgt een uitleg van enkele menu knoppen. De overige hebben geen uitleg nodig.

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. Gebruik dan het Flat top window.

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. Wanneer je "None + DEMO" hebt geselecteerd tijdens het drukken van de Start knop, kom je in de Demo mode. Je kunt dan twee signalen en ruis simuleren om de effecten van de verschillende windows te bekijken.

Rate
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. Bij "opname apparaten", "geavanceerd" vind je de setting "gedeelde modus" en daar kun je de echte sample rate van de hardware 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.

T=20ms
Het bleek dat de eerste 20ms van de audio buffer vaak verstoord is. Met deze schuifbalk kun je de tijd instellen van dat eerste stuk van de audio buffer. Dat stuk wordt niet gebruikt. Bij mij was 20ms voldoende, maar moet bij andere PC's misschien vergroot worden.


SOFTWARE

Download de ZIP file, unzip hem in de gewenste directory en klik de EXE file aan. Je bent geen Administrator Rights nodig om iets te installeren, er wordt niets in registers gewijzigd. Ook is er een ZIP file met de source code van het complete project.


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.


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


Nog iets over de conversie van VB6 naar VB8.NET
De conversie ging automatisch, maar een paar essenti�le zaken werkten niet meer. Zo werd er geen audio meer opgenomen van de geluidskaart. Dat bleek redelijk snel te verhelpen. VB8 kende de types "Any" en "Object" niet meer. Maar het kostte wel twee weken voordat ik een beetje begreep hoe dat audio deel werkte. Een probleem was dat er geen goede voorbeelden op Internet te vinden waren. In Python was dat veel eenvoudiger, na een avond was het met Python al volledig duidelijk hoe je met de geluidskaart audio moet opnemen en weergeven.

En er konden geen lijnen meer getrokken worden in de Picture Box. Dat was totaal gewijzigd. Je moest eerst een Graphic Object aanmaken. Maar daar had Microsoft een goede reden voor, de grafische mogelijheden zijn enorm uitgebreid. Kon je vroeger alleen lijnen trekken in een Picture Box, nu kun je overal lijnen trekken, een hele verbetering dus!
En toen bleek het scherm heel irritant te flikkeren. Op internet was er veel over te lezen, er waren veel meer personen met dit probleem. Maar een goede oplossing was moeilijk te vinden en kostte weer een paar avonden. De oplossing werd gevonden op het MSDN netwerk van Microsoft. Eerst moet een Grafische Buffer worden gemaakt. Daar teken je alles in en dan wordt deze in een keer gecopieerd naar de Picture Box. Deze procedure staat bekend als "Manually Rendering Buffered Graphics". En toen bleek het gebruik van het PC geheugen toe te nemen tot maar liefst 133 Mb! Want wanneer je zo'n object aanmaakt moet je dispose("graphic buffer name") toepassen. Anders worden er steeds meer aangemaakt tot een bepaald maximum.

Er stond iets over "Marshal attributes" in het log over de conversie. Wat was dat nu weer? Het bleek te maken te hebben met geheugen toewijzing. Alle oude functies in de "kernell32.lib" zijn vervangen door deze veel simpelere Marshal functies en attributes.

Al met al ging er toch nog veel tijd inzitten, maar Visual Basic heeft een geweldige ontwikkel omgeving met heel veel mogelijkheden en is zelfs gratis voor eigen gebruik. Wel is het heel complex. Python is veel eenvoudiger en voor onze toepassingen meestal meer dan voldoende. Maar ik zal zeker vaker met Visual Basic spelen!


TERUG NAAR DE INDEX PA2OHH