Inhoudsopgave:

Tuner: 9 stappen
Tuner: 9 stappen

Video: Tuner: 9 stappen

Video: Tuner: 9 stappen
Video: Unique Identity 100% Tuning 2009 Stappen Rotterdam & CRX stand 2024, November
Anonim
Image
Image
Uitrustingslijst (maak een foto van het bord en Kevin's Comp)
Uitrustingslijst (maak een foto van het bord en Kevin's Comp)

Dit project was bedoeld om een gitaartuner te maken met behulp van Vivado en een 7-segments display. Zodra de tuner de frequentie van het ingevoerde geluid heeft gevonden, vergelijkt de tuner die waarde met een lijst met hardgecodeerde waarden voor exacte frequenties die bekend staan als de standaardfrequentie voor de juiste toonhoogte van een noot. Vervolgens zal de tuner weergeven hoe dicht of ver uw ingevoerde geluid van de gewenste noot af is. Wat interessant is, is dat een geluidsgolf een combinatie is van meerdere sinusoïdale golfvormen met echte en imaginaire componenten. Hoewel dit voor onbekenden misschien moeilijk lijkt om mee te werken, zijn er een paar manieren waarop we een golf met echte en denkbeeldige waarden toch kunnen analyseren.

Demo:

Stap 1: Uitrustingslijst (maak een foto van het bord en Kevin's Comp)

Eerst hebben we een Basys 3-bord nodig en een computer die de volgende programma's ondersteunt. Garageband/Audacity of een andere DAW - om via een microfoon op te nemen en wav-bestanden te exporteren

Python - in staat om pylab en scipy te gebruiken voor bemonstering en fft

Vivado - om verbinding te maken met het Basys 3-bord en visueel de resultaten te zien

Stap 2: Overzicht

Overzicht
Overzicht

Een tuner bestaat uit enkele belangrijke componenten: microfoon, sampler, FFT (Fast Fourier Transform), comparator, decoder en display. Het doel van de microfoon is om de ingangsgolfvorm vast te leggen. De sampler ontvangt het uitgangssignaal van de microfoon en gebruikt de FFT om het signaal om te zetten in een output van grootte in frequenties. Gebruik vervolgens de uitvoer van de FFT en vind de maximale grootte en de bijbehorende frequentie gedeeld door 2, de frequentie die hoort bij de toonhoogte van de golfvorm kan worden gevonden. Die waarde kan dan in de comparator. Het wordt dan vergeleken met een opzoektabel, die al frequentiewaarden heeft ingesteld voor perfecte toonhoogtes van alle noten. De comparator krijgt een invoer voor de gewenste noot, die hij vervolgens kan matchen met de gewenste noot met de juiste frequentie uit de opzoektabel. Vervolgens kiest de comparator de noot met de frequentie die het dichtst bij de maximale frequentie ligt. De comparator vergelijkt de twee waarden en ziet dat de waarde van de frequentie de gewenste is en zet die gegevens vervolgens in een signaal. De comparator stuurt dat signaal naar de decoder, waar de decoder de ingangen voor de anodes van het 7-segments display kiest om de nauwkeurigheid van het biljet weer te geven.

Stap 3: Wav-bestand

Wav-bestand
Wav-bestand

In deze stap nemen we een wav-bestand van een toonhoogte en proberen we de frequentie van die toonhoogte uit te voeren.

Eerst heb je een wav-bestand van een notitie nodig. In dit voorbeeld gebruiken we een 16 bit stereo wav-bestand met een bemonsteringsfrequentie van 44,1 kHz. Dit kan worden gemaakt in een DAW zoals Garageband of worden gedownload. Voor dit voorbeeld kan hier een door ons gegenereerde A4 440Hz-sinusgolf op Garageband worden gedownload.

Stap 4: Python- Gebruik van Pylab en Scipy

Python- Gebruik van Pylab en Scipy
Python- Gebruik van Pylab en Scipy

We gebruikten de Python-bibliotheek voor het uitvoeren van "Fast Fourier-transformatie". Dankzij online bronnen konden we imiteren en zien wat nuttig is in pylab en scipy.

1. Als u pylab of scipy niet hebt geïnstalleerd, moet u dit doen. Of, Pycharm heeft een zeer goede functie, wanneer je pylab of scipy probeert te importeren, is er een kronkelige onderstreping die je vertelt dat je de bibliotheek nog niet hebt geïnstalleerd. U kunt ze dan direct installeren door op de rode gloeilamp te drukken (deze verschijnt wanneer u uw cursor in de buurt van de kronkelende onderstreping plaatst).

2. Gebruik de functie scipy.io.wavfile.read om gegevens uit het voorbeeldwav-bestand te lezen en eruit te halen. Doorloop de gegevens door pylab.fft, het zal u een lijst met grootte voor de kracht retourneren.

3. Zoek vervolgens het maximum van het uitgestraalde vermogen uit de lijst. Zoek naar de lijstindex waar het maximale vermogen voorkomt, omdat dit de snellere manier is om te vinden welke frequentie met dat vermogen wordt geassocieerd. Geef ten slotte de maximale frequentie terug. Omdat we later een binair frequentiesignaal in VHDL-code moeten invoeren, kunnen we de frequentie in float in binair omzetten en retourneren.

Stap 5: Python-sampling en FFT (Toon code en de resultaten ervan)

In deze stap gaan volledige credits naar deze link hieronder voor de bemonstering en FFT.

samcarcagno.altervista.org/blog/basic-sound…Onze code:

Nadat pylab en scipy zijn geïnstalleerd, kunnen wav-bestanden worden geïmporteerd en gelezen.

van pylab import*van scipy.io import wavfile

sampFreq, snd = wavfile.read('440_sine.wav')

Vervolgens vertegenwoordigt snd.shape de monsterpunten en het aantal kanalen. In ons geval hangen de samplepunten af van hoe lang het wavbestand is en het aantal kanalen is 2 omdat het stereo is.

Dan snd = snd / (2.**15)…… xlabel('Tijd (ms)')

organiseert het tijdsignaal in een array.

Vervolgens maakt de FFT een array in frequentie en grootte (Power)

Dan wordt via een while-lus de maximale magnitude en de bijbehorende frequentie gevonden. Die frequentie/2 vertegenwoordigt de toonhoogte van het wavbestand.

Vervolgens werd met behulp van onze eigen code het gehele getal dat de frequentie vertegenwoordigt, omgezet in een 12-bits binair getal en er werd een tekstbestand gemaakt met dat getal erin.

Stap 6: Vivado (vergelijker)

Vivado (vergelijker)
Vivado (vergelijker)

In dit deel van het proces hebben we een comparator nodig om twee ingangsfrequenties te vergelijken.

1. Een comparator gemaakt om te vergelijken of de ingangsfrequentie (ontvanger) hoger, lager of binnen het gedefinieerde margebereik van 2 Hz ligt. (typische gitaartuner varieert van e2 tot g5, 82 Hz tot 784 Hz).

2. Bij het creëren van een marge van 2 Hz hebben we een RCA gebruikt om "00000000000010" toe te voegen aan de ontvangerfrequentie en te controleren waar deze nog steeds te laag is voor gebruikersinvoer. Als dat het geval is, single bit signaal “high” <= ‘0’, “low” <= ‘1’. Vervolgens voegen we "0000000010" toe aan de gebruikersinvoer om te kijken of de ontvangerinvoer zelfs hoger is dan dat. Als dat het geval is, “hoog” <= ‘1’, “laag” <= ‘0’. Noch de zaak zou beide '0' retourneren.

3. Aangezien het volgende deel van de module specifieke 4-bits gegevens nodig heeft om te vertellen wat de noot van de ontvanger is, moeten we niet alleen de 2 vergelijkende uitgangen (laag en hoog) retourneren, we moeten de code-associate terugsturen naar notitie, die associëren met de frequentie. Raadpleeg de onderstaande grafiek:

C | 0011

C# | 1011

D | 0100

D# | 1100

E | 0101

F | 0110

F# | 1110

G | 0111

G# | 1111

een | 0001

A# | 1001

B | 0010

Verschillende if-statements gebruiken om ze in noot te categoriseren en ze te coderen in wat nodig is voor de decoder met zeven segmenten.

Stap 7: FOTO'S VAN BASYS 3 Board

FOTO'S VAN BASYS 3 Bord
FOTO'S VAN BASYS 3 Bord

Stap 8: Vivado (7 Segment Decoder Met Multiplexing)

Vivado (7 Segment Decoder Met Multiplexing)
Vivado (7 Segment Decoder Met Multiplexing)

Alles heeft een display nodig. Het is een belangrijke factor die de waarde van een ontwerp bepaalt. Daarom moeten we een display maken met een decoder met zeven segmenten, waarmee we kunnen aantonen dat we een tuner op het B-bord kunnen ontwerpen. Het zou ons ook helpen bij het testen en debuggen.

Een decoder met zeven segmenten bevat ingangen met de naam Note, low, high en CLK, terwijl SSEG, AN en Fiz_Hz worden uitgevoerd. Er is een afbeelding van een blokschema hierboven om ons te helpen het ontwerp te begrijpen.

Het doel van het hebben van twee afzonderlijke lage en hoge ingangen is om de ontwerper van de comparator de vrijheid te geven om te manipuleren of de geluids(golf)frequentie hoger of lager is dan de ingangsfrequentie (Fix_Hz) die de gebruiker wil vergelijken. Bovendien vertegenwoordigt de output SSEG het display met zeven segmenten en de punt ernaast, terwijl de AN de anodes vertegenwoordigt waarvoor de set van het display met zeven segmenten moet oplichten.

In deze decoder met zeven segmenten speelt de klok (CLK) een belangrijke rol bij het weergeven van twee verschillende waarden op twee of meer verschillende anodes. Omdat het bord ons niet toestaat om twee verschillende waarden tegelijkertijd weer te geven, moeten we multiplexen gebruiken om een waarde één voor één weer te geven, terwijl we snel genoeg overschakelen naar een andere waarde zodat onze ogen deze niet kunnen vastleggen. Dit is waar de CLK-ingang in het spel komt.

Raadpleeg de broncode voor meer informatie.

Stap 9: Vivado (combineren van componenten)

Nadat alle modules (python-ontvanger, comparator, zevensegmentdecoder, enz.) zijn voltooid, hebben we vervolgens een grotere module samengesteld. Net als de afbeelding onder "Overzicht" die wordt getoond, verbinden we elk signaal dienovereenkomstig. Raadpleeg voor referentie onze broncode "SW_Hz.vhd".

Bedankt. Hoop dat je geniet.

Aanbevolen: