Spisu treści:

Tuner: 9 kroków
Tuner: 9 kroków

Wideo: Tuner: 9 kroków

Wideo: Tuner: 9 kroków
Wideo: 9-latka zabija instruktora strzelectwa z karabinu UZI. 2024, Listopad
Anonim
Image
Image
Lista wyposażenia (zrób zdjęcie tablicy i komputer Kevina)
Lista wyposażenia (zrób zdjęcie tablicy i komputer Kevina)

Ten projekt miał na celu wykonanie tunera gitarowego przy użyciu Vivado i 7-segmentowego wyświetlacza. Gdy tuner znajdzie częstotliwość wprowadzonego dźwięku, porówna tę wartość z listą zakodowanych na stałe wartości dla dokładnych częstotliwości, które są znane jako częstotliwość standardowa dla prawidłowego tonu nuty. Następnie tuner wyświetli, jak blisko lub daleko znajduje się wprowadzony dźwięk od żądanej nuty. Co ciekawe, fala dźwiękowa to połączenie wielu przebiegów sinusoidalnych z rzeczywistymi i urojonymi składowymi. Chociaż może się to wydawać trudne do pracy dla osób nieznających, istnieje kilka sposobów, dzięki którym nadal możemy analizować falę z wartościami rzeczywistymi i urojonymi.

Próbny:

Krok 1: Lista wyposażenia (zrób zdjęcie tablicy i komputer Kevina)

Najpierw potrzebujemy płyty Basys 3 i komputera obsługującego następujące programy. Garageband/Audacity lub inny DAW - do nagrywania przez mikrofon i eksportu plików wav

Python - potrafi używać pylab i scipy do próbkowania i fft

Vivado - aby połączyć się z płytą Basys 3 i wizualnie zobaczyć wyniki

Krok 2: Przegląd

Przegląd
Przegląd

Tuner składa się z kilku ważnych elementów: mikrofonu, samplera, FFT (szybka transformata Fouriera), komparatora, dekodera i wyświetlacza. Celem mikrofonu jest przechwytywanie przebiegu wejściowego. Sampler odbiera sygnał wyjściowy mikrofonu i wykorzystuje FFT do konwersji sygnału na wyjście o wielkości w częstotliwościach. Następnie korzystając z danych wyjściowych FFT i znajdując maksymalną wielkość i związaną z nią częstotliwość podzieloną przez 2, można znaleźć częstotliwość związaną z wysokością fali. Ta wartość może następnie przejść do komparatora. Jest on następnie porównywany z tabelą przeglądową, która ma już ustawione wartości częstotliwości dla doskonałych tonów wszystkich nut. Komparator otrzymuje dane wejściowe dla żądanej nuty, które następnie może dopasować do żądanej nuty do jej właściwej częstotliwości z tabeli wyszukiwania. Następnie komparator wybierze nutę o częstotliwości najbliższej częstotliwości maksymalnej. Komparator porówna te dwie wartości i zobaczy zbliżoną wartość częstotliwości do pożądanej, a następnie umieści te dane w sygnale. Komparator wyśle ten sygnał do dekodera, gdzie dekoder wybierze wejścia dla anod wyświetlacza 7-segmentowego, aby pokazać dokładność nuty.

Krok 3: Plik WAV

Plik WAV
Plik WAV

W tym kroku weźmiemy plik wav o wysokości tonu i spróbujemy wyprowadzić częstotliwość tego tonu.

Najpierw potrzebujesz pliku wav notatki. W tym przykładzie użyjemy 16-bitowego pliku wav stereo z częstotliwością próbkowania 44,1 kHz. Można to utworzyć w DAW, takim jak Garageband, lub pobrać. W tym przykładzie falę sinusoidalną A4 440Hz wygenerowaną przez nas w Garageband można pobrać tutaj.

Krok 4: Python - zastosowania Pylab i Scipy

Python - zastosowania Pylab i Scipy
Python - zastosowania Pylab i Scipy

Wykorzystaliśmy bibliotekę Pythona do wykonania „szybkiej transformacji Fouriera”. Zasoby online pozwoliły nam naśladować i zobaczyć, co jest przydatne w pylab i scipy.

1. Jeśli nie zainstalowałeś pylab lub scipy, musisz to zrobić. Lub, Pycharm ma bardzo dobrą funkcję, gdy próbujesz zaimportować pylab lub scipy, pojawia się faliste podkreślenie informujące, że nie zainstalowałeś jeszcze biblioteki. Następnie możesz je zainstalować bezpośrednio, naciskając czerwoną żarówkę (pojawi się, gdy umieścisz kursor w pobliżu falistego podkreślenia).

2. Korzystając z funkcji scipy.io.wavfile.read, odczytaj i wyciągnij dane z przykładowego pliku wav. Przejrzyj dane przez pylab.fft, zwróci ci listę wielkości mocy.

3. Następnie znajdź maksymalną moc emitowaną z listy. Poszukaj indeksu listy, w którym występuje maksymalna moc, ponieważ jest to szybszy sposób na znalezienie częstotliwości związanej z tą mocą. Na koniec zwróć maksymalną częstotliwość. Ponieważ później musimy wprowadzić binarny sygnał częstotliwości do kodu VHDL, możemy przekonwertować częstotliwość z wartości zmiennoprzecinkowej na binarną i zwrócić ją.

Krok 5: Próbkowanie Pythona i FFT (pokaż kod i jego wyniki)

Na tym etapie pełne kredyty przejdź do tego linku poniżej, aby uzyskać próbkowanie i FFT.

samcarcagno.altervista.org/blog/basic-sound…Nasz kod:

Po zainstalowaniu pylab i scipy, pliki wav mogą być importowane i odczytywane.

z pylab import * ze scipy.io import wavfile

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

Następnie snd.shape reprezentuje punkty próbkowania i liczbę kanałów. W naszym przypadku punkty próbkowania zależą od długości pliku wav, a liczba kanałów wynosi 2, ponieważ jest stereo.

Następnie snd = snd / (2.**15)…… xlabel('Czas (ms)')

organizuje sygnał czasu w tablicę.

Następnie FFT tworzy tablicę częstotliwości i wielkości (mocy)

Następnie przez chwilę pętla maksymalna wielkość i częstotliwość z nim związana jest znaleziona. Częstotliwość / 2 reprezentuje wysokość pliku wav.

Następnie za pomocą naszego własnego kodu liczba całkowita reprezentująca częstotliwość została przekonwertowana na 12-bitową liczbę binarną i stworzono plik tekstowy z tą liczbą.

Krok 6: Vivado (porównanie)

Vivado (porównanie)
Vivado (porównanie)

W tej części procesu potrzebujemy komparatora do porównania dwóch częstotliwości wejściowych.

1. Utworzono komparator do porównania, czy częstotliwość wejściowa (odbiornika) jest wyższa, niższa lub mieści się w zdefiniowanym zakresie marginesu 2 Hz. (typowy tuner gitarowy waha się od e2 do g5, od 82 Hz do 784 Hz).

2. Tworząc margines 2 Hz, użyliśmy RCA, aby dodać „0000000000010” do częstotliwości odbiornika i sprawdzić, gdzie jest ona nadal zbyt niska dla danych wejściowych użytkownika. W takim przypadku sygnał jednobitowy „wysoki” <= „0”, „niski” <= „1”. Następnie dodajemy „00000000010” do danych wejściowych użytkownika, aby sprawdzić, czy wejście odbiornika jest nawet wyższe. W takim przypadku „wysoki” <= „1”, „niski” <= „0”. Ani przypadek, aby oba zwrócili „0”.

3. Ponieważ kolejna część modułu potrzebuje konkretnych 4-bitowych danych, aby powiedzieć, jaka jest notatka odbiornika, nie tylko zwracając 2 wyjścia porównawcze (niski i wysoki), musimy zwrócić kod skojarzony z notatką, z którym skojarzymy częstotliwość. Proszę zapoznać się z poniższą tabelą:

C | 0011

C# | 1011

D | 0100

D# | 1100

E | 0101

F | 0110

F# | 1110

G | 0111

G# | 1111

| 0001

A# | 1001

B | 0010

Używanie kilku instrukcji if do kategoryzacji ich w notatki i zakodowania ich w to, co jest potrzebne w dekoderze siedmiosegmentowym.

Krok 7: ZDJĘCIA PŁYTY BASYS 3

ZDJĘCIA PŁYTY BASYS 3
ZDJĘCIA PŁYTY BASYS 3

Krok 8: Vivado (7-segmentowy dekoder z multipleksowaniem)

Vivado (7-segmentowy dekoder z multipleksowaniem)
Vivado (7-segmentowy dekoder z multipleksowaniem)

Wszystko potrzebuje wyświetlacza. Jest to ważny czynnik, który decyduje o wartości projektu. Dlatego musimy stworzyć wyświetlacz przy użyciu dekodera siedmiosegmentowego, który pozwoli nam zademonstrować naszą umiejętność zaprojektowania tunera na płytce B. Pomogłoby nam również w testowaniu i debugowaniu.

Dekoder siedmiosegmentowy zawiera wejścia o nazwach Note, low, high i CLK, podczas gdy wysyła SSEG, AN i Fiz_Hz. Powyżej znajduje się zdjęcie schematu blokowego, które pomoże nam zrozumieć projekt.

Celem posiadania dwóch oddzielnych wejść niskich i wysokich jest zapewnienie projektantowi komparatora swobody manipulowania, czy częstotliwość dźwięku (fala) jest wyższa czy niższa niż częstotliwość wejściowa (Fix_Hz), którą użytkownik chce porównać. Ponadto wyjście SSEG reprezentuje wyświetlacz siedmiosegmentowy, a następną kropkę, podczas gdy AN reprezentuje anody, dla których zestaw siedmiosegmentowy ma się zapalić.

W tym siedmiosegmentowym dekoderze zegar (CLK) odgrywa ważną rolę w wyświetlaniu dwóch różnych wartości na dwóch lub więcej różnych anodach. Ponieważ tablica nie pozwala nam wyświetlać dwóch różnych wartości jednocześnie, musimy użyć multipleksowania, aby wyświetlić wartość pojedynczo, jednocześnie przełączając się na inną wartość na tyle szybko, że nasze oczy nie są w stanie jej uchwycić. Tutaj do gry wchodzi wejście CLK.

Aby uzyskać więcej informacji, zapoznaj się z kodem źródłowym.

Krok 9: Vivado (Łączenie komponentów)

Po ukończeniu każdego modułu (odbiornik Pythona, komparator, dekoder siedmiosegmentowy itp.) łączymy je razem przy użyciu większego modułu. Podobnie jak na obrazku w sekcji „Over view”, każdy sygnał podłączamy odpowiednio. W celach informacyjnych sprawdź nasz kod źródłowy „SW_Hz.vhd”.

Dziękuję Ci. Mam nadzieję, że ci się podoba.

Zalecana: