Fuzz klasyczny na LPC55S28

Fuzz klasyczny na LPC55S28

W poprzednim artykule - poświęconym demonstracji działania modułu z mikrokontrolerem LPC55S28 firmy NXP - zaprezentowaliśmy projekt nieco zmodyfikowanego, klasycznego efektu typu „fuzz graficzny”. Efekt ten przeznaczony jest jednak głównie do gitary prowadzącej. Tym razem prezentujemy opis fuzza (in. distortion) klasycznego.

Fuzz klasyczny dorównuje popularnością swojemu poprzednikowi, ale jego brzmienie jest ostrzejsze. Duży wpływ na brzmienie tego efektu ma pasmo sygnału wejściowego dlatego dla jego modyfikacji zastosowano regulowany filtr górnoprzepustowy II rzędu. W zaprezentowanym rozwiązaniu i w torze dźwiękowym, bezpośrednio przed samym fuzzem zastosowano filtr górnoprzepustowy drugiego stopnia. Natomiast po przetworzeniu sygnału przez algorytm efektu następuje filtracja niskich częstotliwości. Zastosowanie filtru dolnoprzepustowego ma na celu złagodzenie brzmienia lub jego przytłumienie.

Ponadto w projekcie dostępne są 4 rodzaje efektu fuzz, które wprowadzają zarówno zniekształcenia o naturalnym brzmieniu, jak i dość nietypowe efekty akustyczne. Do zamiany sygnału analogowego na cyfrowy oraz konwersji w przeciwną stronę - podobnie jak w poprzednich rozwiązaniach - stosowany jest 16-bitowy kodek, znajdujący się na płytce modułu. Do sterowania parametrami urządzenia służą przyciski umieszczone na płytce oraz graficzny wyświetlacz monochromatyczny o rozdzielczości 128×64 px.

Koncepcja urządzenia

Działanie urządzenia jest dość proste. Sygnał akustyczny, zmieniony na postać cyfrową, jest filtrowany przez FGP o regulowanej częstotliwości granicznej, a następnie wprowadzane są zniekształcenia. Do wyboru mamy cztery rodzaje zniekształceń:

• Fuzz klasyczny - polega na silnym wzmocnieniu sygnału, a następnie ograniczeniu jego wartości (rysunek 1).

Rysunek 1. Schemat blokowy całego urządzenia

• Fuzz o stałych zniekształceniach - w tym przypadku sygnał ulega nieznacznemu wzmocnieniu, a amplituda jest ograniczana na poziomie jego wartości wejściowej (zasada wprowadzania zniekształceń jest taka sama, jak w poprzednim rozwiązaniu). Wizualizację opisanej metody również pokazuje rysunek 1.
• Efekt polegający na tym, że z sygnału odcinana jest dolna część (pomiędzy zerem a ustalonym poziomem) - patrz rysunek 2.

Rysunek 2. Wprowadzanie zniekształceń poprzez ograniczenie wartości

• Efekt polegający na zwiększaniu wzmocnienia powyżej określonej wartości amplitudy sygnału; wywołuje wrażenie dźwiękowe podobne do pękania (rysunek 3).

Rysunek 3. Wprowadzanie zniekształceń poprzez odcięcie części sygnału poniżej ustalonej wartości
Rysunek 4. Wprowadzanie zniekształceń poprzez zwiększenie chwilowej wartości wzmocnienia

Zasada działania układów wprowadzających zniekształcenia

Działanie pierwszego typu efektu distrotion opiera się na dużym wzmocnieniu sygnału akustycznego, które jest regulowane, a następnie na ograniczeniu jego wartości. Proces ten ilustruje rysunek 5.

Rysunek 5. Zasada działania efektu distortion pierwszego typu

W drugim rodzaju efektu wprowadzane zniekształcenia mają tę samą wartość, niezależną od amplitudy. W układzie tym wykonujemy pomiar wartości sygnału, a następnie ograniczamy ją, w zależności od zmierzonej amplitudy. Obrazuje to rysunek 6.

Rysunek 6. Zasada działania efektu distortion drugiego typu

Trzeci typ układu wprowadzający zniekształcenia odcina od sygnału jego dolną wartość. Tu też mierzymy wartość sygnału, a układ ograniczający jest od niej zależny (rysunek 7).

Rysunek 7. Zasada działania efektu distortion trzeciego typu

W ostatnim z opisywanych rodzajów układu zniekształcającego poziom sygnału jest mierzony i porównywany z jego wartością chwilową. Jeśli amplituda przekroczy pewną wartość (proporcjonalną do zmierzonego poziomu), zmianie ulega wartość wzmocnienia (rysunek 8).

Rysunek 8. Zasada działania efektu distortion czwartego typu

Jak już wspomniałem we wstępie do niniejszego artykułu, układ zniekształcający poprzedza filtr górnoprzepustowy. Struktura tego filtru pokazana jest na rysunku 9.

Rysunek 9. Struktura filtru górnoprzepustowego II rzędu

Bloki Z-1 symbolizują rejestry pamiętające. Układ działa poprzez analogię do zwykłego układu RC. W algorytmie wykorzystujemy zasadę, że napięcie (Uc) na kondensatorze o pojemności (C) jest całką płynącego przezeń prądu (ic). Natomiast wartość tego prądu zależy - jak wiemy z prawa Ohma - od spadku napięcia na rezystorze oraz jego wartości (R). Wartość napięcia na rezystorze stanowi różnicę napięcia wejściowego (Uwe) i wartości napięcia na kondensatorze (Uc).

gdzie:

  • fg - częstotliwość graniczna filtru,
  • fc - częstotliwość próbkowania.

czyli:

A z budowy układu różniczkującego wynika:

Schemat blokowy filtru dolnoprzepustowego można natomiast zobaczyć na rysunku 10.

Rysunek 10. Struktura filtru dolnoprzepustowego II rzędu

Opis programu komputerowego

Cały program składa się z dwóch części: zestawu procedur przetwarzania sygnału (w których skład wchodzi również komunikacja z kodekiem) oraz obsługi interfejsu użytkownika (odpowiedzialnej za ustawianie parametrów urządzenia, obsługę przycisków sprzętowych i enkodera oraz sterowanie wyświetlaczem graficznym). Interfejs graficzny pomyślany został w taki sposób, że na wyświetlaczu prezentowane są obiekty służące do wprowadzania danych do programu. Ich stan lub wartość można zmieniać za pomocą enkodera, natomiast przełączać je można za pomocą dwóch przycisków. W naszym urządzeniu na wyświetlaczu znajduje się lista wyboru efektu oraz słupek do regulacji poziomu zniekształceń.

Część DSP. Sterowanie kodekiem

Ponieważ w poprzednich artykułach omówiłem szczegółowo transmisję pomiędzy mikrokontrolerem a kodekiem, w tym artykule zamieszczę jedynie ilustracje obrazujące jej działanie (rysunki 11 i 12).

Rysunek 11. Schemat blokowy kodeka
Rysunek 12. Realizacja transmisji pomiędzy MPU a kodekiem

Procedury DSP

Ponieważ ogólny zarys działania programu został opisany w poprzednich punktach, tym razem wyjaśnię tylko algorytmy procedur wprowadzających zniekształcenia oraz zamieszczę fragment programu źródłowego zawierający procedury DSP (listing 1). Główną procedurą w zaprezentowanym fragmencie kodu jest funkcja „PrzetwarzanieGłowne”, wywoływana w każdym cyklu próbkowania sygnału i odpowiednio rozdzielająca zadania przetwarzania sygnału pomiędzy różne warianty algorytmu i jego elementów.

#define FGPII(n,k,x){\
static float n##c1, n##c2;\
n##c1 += (x-n##c1)*(float)k;\
x -= (n##c1+n##c2);\
n##c2 += x*(float)k;}

#define FDPII(n,k,x){\
static float n##c1, n##c2;\
n##c1 += (x-n##c1)*(float)k;\
n##c2 += (n##c1-n##c2)*(float)k;\
x=n##c2;}

float ZN = 0.5;
float FDP_K = 2*STALA_PI*5000/FP;
float FGP_K = 2*STALA_PI*200/FP;
int ENum = 0;



float __attribute__((section(".ramfunc.$SRAMX"))) F3(float we)
{
register float ww, wsp, ha, fk = 0.4+ZN;

PomiarAmplitudy(P_,we);

wsp = P_BA*fk;
ww = ((we>wsp) ? (we-wsp)/(1.41-fk):
((we<-wsp) ? (we+wsp)/(1.41-fk) : 0));

return ww;
}

float __attribute__((section(".ramfunc.$SRAMX"))) F4(float we)
{
register float pb;

register float ww = 0, fk = ((float)1.4-(float)1)*ZN+(float)1;

PomiarAmplitudy(P_,we);

pb = (we<0) ? -we : we;

ww = (pb>fk*P_BA) ? we*3 : we;

return ww/1.5;
}

float __attribute__((section(".ramfunc.$SRAMX"))) F1(float w)
{
register float ww = w;

ww *=(float)50*ZN;
ww = (ww>FUZZ_A) ? FUZZ_A : ((ww<-FUZZ_A) ? -FUZZ_A : ww);

return ww;
}

float __attribute__((section(".ramfunc.$SRAMX"))) F2(float w)
{
PomiarAmplitudy(PA_,w);
register float ba = PA_BA;
w *= ((float)50*ZN);
if(w>ba) return ba;
else if(w<-ba) return -ba;
else return 0;
}

void __attribute__((section(".ramfunc.$SRAMX"))) PrzetwarzanieGlowne()
{
static float (*FT[4])(float) = {F1,F2,F3,F4};

float w = ((float)WartoscWE_L + (float)WartoscWE_P)/(float)0x7FFF;

FGPII (fgp,FGP_K, w);
w = FT[ENum](w);
FDPII (fdp,FDP_K, w);

WartoscWY_P = WartoscWY_L = (int16_t)(w*(float)0x7FFF);
}

Listing 1. Fragment kodu prezentujący procedurę przetwarzania sygnału

Na rysunku 13 widać, że działanie tego algorytmu polega na porównywaniu wzmocnionego sygnału akustycznego z jego amplitudą - i w przypadku przekroczenia progu sygnał zostaje ograniczony do jej wartości.

Rysunek 13. Działanie algorytmu wprowadzania zniekształceń dla efektu typu 2

Działanie algorytmu efektu typu 1 jest podobne, z tym że wartość sygnału akustycznego porównywana jest ze stałą wartością.

Efekt typu 3 (rysunek 14) również porównuje wartość sygnału akustycznego z poziomem zależnym od amplitudy sygnału, przy czym porównywana amplituda pomnożona zostaje przez współczynnik mniejszy od jedności. Sygnał wejściowy poniżej tej wyliczonej wartości ulega wyzerowaniu, natomiast wartość przekraczająca ją zostaje zmniejszona o tę właśnie wartość (porównywaną) oraz pomnożona przez wyliczony współczynnik (w celu kompensacji jej wielkości). Jest to konieczne, ponieważ odjęcie wartości progowej powoduje znaczne zmniejszenie poziomu sygnału.

Rysunek 14. Działanie algorytmu wprowadzania zniekształceń dla efektu typu 3

Efekt typu 4 (rysunek 15) porównuje amplitudę sygnału z poziomem o wartości nieco mniejszej od wartości maksymalnej amplitudy. Jeśli sygnał przekracza tę wartość, jest mnożony przez stały współczynnik.

Rysunek 15. Działanie algorytmu wprowadzania zniekształceń dla efektu typu 4

Opis układu elektrycznego

Chociaż układ zbudowany jest w oparciu o gotowy moduł z mikrokontrolerem firmy NXP, do jego działania potrzebnych będzie kilka elementów dodatkowych. Są to: wyświetlacz graficzny 128×64 piksele oraz układ do jego sterowania. Istnieje opcja dołączenia do modułu dwóch przycisków, choć nie ma takiej konieczności, bo do sterowania urządzeniem można wykorzystywać przyciski znajdujące się na płytce ewaluacyjnej. Zastosowany w naszym układzie wyświetlacz graficzny jest w stanie pracować w dwóch trybach. Może być sterowany za pomocą transmisji równoległej lub szeregowej w protokole SPI. W prezentowanym projekcie stosujemy tryb transmisji szeregowej. Ponieważ wyświetlacz fabrycznie skonfigurowany został do pracy przy transmisji równoległej, należy przełączyć zworę, która znajduje się na jego tylnej części (rysunek 16).

Rysunek 16.  Schemat podłączenia wyświetlacza

Dodatkowo - ponieważ układ logiczny wyświetlacza jest sterowany napięciami niezgodnymi ze standardem 3,3 V, czyli sygnałami wyjściowymi mikrokontrolera (wysoki stan wejść wymaga napięcia wyższego niż 3,5 V) - zastosowano bufor 74HCT541. Schemat części elektrycznej pokazany został na rysunku 17.

Rysunek 17. Schemat części elektrycznej

Elementy zastosowane w układzie

Aby uzyskać dobre wrażenie optyczne, w urządzeniu zastosowano monochromatyczny wyświetlacz graficzny LCD o rozdzielczości 128×64 px typu LCD-EG-128064H-FHW K/W-E6. Charakteryzuje się on niską ceną i jest dostępny w wielu sklepach internetowych, w tym także u polskich dystrybutorów. Jako bufor wykorzystano układ 74HCT541 - również łatwo dostępny i przystępny cenowo. Potencjometr do regulacji kontrastu może być dowolnym potencjometrem montażowym o rezystancji około 25 kΩ. Jako enkoder można zastosować dowolny trójwyjściowy enkoder inkrementalny.

Tomasz Krogulski

Artykuł ukazał się w
Elektronika Praktyczna
kwiecień 2024
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik grudzień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio styczeń - luty 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna grudzień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich styczeń 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów