HTML

Műszer

Hobby és amatőr elektronika, műszerépítés a XXI. században

Címkék

Friss topikok

  • Nite: @fromi: Ha egy bejegyzéssel kapcsolatos kérdésed van, akkor jobb odaírni kommentbe, mert esetleg m... (2010.11.26. 15:17) FAQ

Licenc

Creative Commons Licenc

DDS Blues

Nite 2010.03.19. 10:16

 Sajnos nem olvastam utána eléggé a DDS témának így írtam róla pár faszságot. Ami engem legjobban zavart a dologban, az a jitter volt, illetve az, hogy magasabb frekvenciákon nem megy végig a generálandó jel összes mintáján... Aztán futtattam néhány szimulációt és kiderült hogy nem olyan rossz a helyzet mint eredetileg sejtettem, ráadásul az is, hogy a DDS hátrányaival együtt tud élni néhány digitális függvénygenerátor, amiket 250 ezer forint körül vesztegetnek, hmmm...

 Néhány sor kódot bedobok ide, amivel mindenki kipróbálhatja és akár jobban meg is értheti, hogyan működik egy DDS (vagy NCO), csak kedvenc fejlesztőeszközünkbe kell másoljuk (ez most C#, de nagyon hasonló Java vagy C is)
double[] LUT = new double[1 << 10];
double[] LUT2 = new double[1 << 10];            

for (int i = 0; i < LUT.Length; i++)
{
    LUT[i] = Math.Sin(((Math.PI * 2) / LUT.Length) * i);
    LUT2[i] = (double)((double)(2.0/LUT2.Length) * i) - 1.0;
}

  Ez eddig semmi érdekes, létrehozzuk a két LUT(Look Up Table)-t, az egyik egy szinusz függvényt tartalmaz, a másik egy fűrész jelet.
 
int xscale = pbOut.Size.Width;
int yscale = pbOut.Size.Height;
Random r = new Random();

Bitmap bitmap = new Bitmap(xscale, yscale);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.FillRectangle(Brushes.White, 0, 0, xscale, yscale);

Int32 freqreg = Int32.Parse(tbFreqReg.Text);
Int32 phaseacc = 0;

float prevx = 0;
float prevy = yscale/2;
float prevx2 = 0;
float prevy2 = yscale / 2;

for (int i = 0; i < xscale; i++)
{
    phaseacc += freqreg;

    // dither
    int dither = r.Next();
    dither &= (1 << 20) -1;   
    dither -= (1 << 19);

    UInt16 crop = (UInt16)((((UInt32)(phaseacc + dither)) >> 20)                   & (UInt16)((1 << 10)-1)) ;

    graphics.DrawLine(Pens.Black, prevx, prevy, i * 4,                           (float)(LUT[crop] * (yscale / 2)) + yscale / 2);
    prevx = i * 4;
    prevy = (float)(LUT[crop] * (yscale / 2)) + yscale / 2;

    graphics.DrawLine(Pens.Red, prevx2, prevy2, i * 4,                          (float)(LUT2[crop] * (yscale / 2)) + yscale / 2);
    prevx2 = i * 4;
    prevy2 = (float)(LUT2[crop] * (yscale / 2)) + yscale / 2;
}
  Ami itt a DDS-re vonatkozik, az a freqreg, aminek az értékét egy textboxba írtam be, és a phaseacc regiszter, ahonnan vesszük a kimenő jel fázisát. A fázis sokkal több bites, mint a LUT, a kettő között a crop vágja le a felesleges biteket. Kísérleteztem egy kis dither -rel is, hogy a kimenő jel spektruma tisztább legyen, de a Fourier transzformációt csinálja meg aki akarja.
 
 A lényeg, hogy a kimenő jel frekvenciája
fout = freqreg * a rendszer órajele / 2 ^ (phaseacc bithossza)
 
 A kimenő frekvencia felbontását csak a fázis akkumulátor hossza határozza meg, persze nagy frekvenciáknál azért a kimenet nem lesz túl szép. 
 
 Egy ilyen DDS megépítésére ideális eszköz egy fpga, meg esetleg egy PIC, amivel a felhasználói felületet biztosítjuk (pl jelalakok, frekvencia megadása). És ki is derült, hogy a Xilinx biztosít egy varázslót az fpga-ihoz, amivel ilyen DDS-t lehet generálni! Ennek a doksija itt található, nem mellesleg ez a legjobb leírás amit a DDS-ről eddig olvastam.
 
 Namost, gyorsan rakjuk össze, hogy mi derült ki: egy fpga (mondjuk Spartan3 2000 Ft), egy USB-s PIC (1500 Ft), egy DAC (1-3000 Ft), pár kondi, ellenállás és tápfeszültség stabilizátor, és készen van a 250 ezer forintos jelgenerátorunk.
 
 Már rendelem is az alkatrészeket :)
 

Címkék: fpga

Szólj hozzá!

A bejegyzés trackback címe:

https://muszer.blog.hu/api/trackback/id/tr441851738

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása