File:TDAC-MDCTs of a sweep.png

Aus Wikimedia Commons, dem freien Medienarchiv
Zur Navigation springen Zur Suche springen

Originaldatei(13.282 × 4.899 Pixel, Dateigröße: 7,76 MB, MIME-Typ: image/png)

Bildtexte

Kurzbeschreibungen

Ergänze eine einzeilige Erklärung, was diese Datei darstellt.
Multiple overlapped TDAC-MDCTs of a frequency sweep y(t) = cos (ct³)

Beschreibung

[Bearbeiten]
Beschreibung
English: Plotted output of
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

using u16 = unsigned __int16;

#define MAX     (3 << 15)
#define WINSIZE 240

static double  X   [MAX+2048];
static double  Y   [MAX+2048];
static double* Z   [MAX+2048];
static u16     Zlen[MAX+2048];

constexpr double Pi = 3.1415926535897932384626433832795;

static double
w0 (int N, int k /*0...2N-1*/)
{
    double const q = (k - N + 0.5) / N;
    return ::fabs(q) < 0.5 ? 1.0 : 0.0;
}

static double
w1 (int N, int k /*0...2N-1*/)
{
    double const q = (k - N + 0.5) / N;
    double const c = ::cos (Pi / 2 * q);
    return c;
}

static double
w2 (int N, int k /*0...2N-1*/)
{
    double const q = (k - N + 0.5) / N;
    double const c = ::cos (Pi / 2 * q);
    return sin (Pi/2*c*c);
}

#define W(N,k)  w2(N,k)

static double
cs (int n, int N, int k /*0...2N-1*/)
{
    return ::cos (Pi/4 / N * (2*n+1+N) * (2*k+1));
}

static double 
MDCT (int _N0, int N, int k /*0...2N-1*/)
{
    double S = 0.0;
    for (int n = 0; n < 2*N; n++)
        S += X[_N0 + n] * W(N, n) * cs(n, N, k);
    return -S / N * sqrt(2);
}

static double 
iMDCT (int _N0, int N, int n /*0...N-1*/)
{
    double S = 0.0;
    for (int k = 0; k < N; k++)
        S += Z[_N0][k] * cs(n, N, k);
    return -S * W(N, n);
}

static void 
Process ()
{
    for (int N0 = 0; N0 <= MAX; N0 += WINSIZE)
    {
        Z[N0] = (double*)::calloc (sizeof(double), Zlen[N0] = WINSIZE);
        for (int k = 0; k < WINSIZE; k++)
            Z[N0][k] = ::MDCT (N0, WINSIZE, k);
    }
    
    for (int N0 = 0; N0 < MAX; N0 += WINSIZE)
    {
        for (int n = 0; n < 2*WINSIZE; n++)
            Y[N0+n] += iMDCT (N0, WINSIZE, n) * sqrt(2);
    }
}

static void 
Generate ()
{
    for (int i = 0; i <= MAX; i++)
        X[i] = 32000.0 * ::cos (Pi*i*i*i / MAX / MAX / 3);
}

static void 
Print1 (FILE* const fp)
{
    for (int i = 0; i < MAX; i++)
    {
        ::fprintf (fp, "%7u\t%15.6f\t%15.6f", i, X[i], Y[i]);
        for (int j = 0; j < Zlen[i]; j++)
            ::fprintf (fp, "\t%15.6f", Z[i][j]);
        ::fprintf (fp, "\n");
    }
}

static void 
Print1 ()
{
    FILE* const fp = ::fopen ("mdct.csv", "wb");
    if (fp)
    {
        ::Print1 (fp);
        ::fclose (fp);
    }
}

static void 
Print2 (FILE* const fp)
{
    for (int j = 0; j < 1024; j++)
    {
        for (int i = 0; i < MAX; i++)
            if (Zlen[i])
                if (Zlen[i] > j)
                    ::fprintf (fp, "\t%15.6f", Z[i][j]);
                else
                    ::fprintf (fp, "\t");
        ::fprintf (fp, "\n");
    }
}

static void 
Print2 ()
{
    FILE* const fp = ::fopen ("mdct_freq.csv", "wb");
    if (fp)
    {
        ::Print2 (fp);
        ::fclose (fp);
    }
}

static void
Window ()
{
    for (int k = 0; k < WINSIZE*2; k++)
        ::printf ("%4u\t%12.6f\t%12.6f\t%12.6f\n", k, w0(WINSIZE,k), w1(WINSIZE,k), w2(WINSIZE,k));
    ::printf ("\n");
}

int main ()
{
    ::Window();
    ::fprintf (stderr, "Generate %u\n", MAX);
    ::Generate();
    ::fprintf (stderr, "Process\n");
    ::Process();
    ::fprintf (stderr, "Print1\n");
    ::Print1();
    ::fprintf (stderr, "Print2\n");
    ::Print2();
    ::fprintf (stderr, "Ready\n");
    return 0;
}
Datum
Quelle Eigenes Werk
Urheber Frank Klemm

Lizenz

[Bearbeiten]
Ich, der Urheber dieses Werkes, veröffentliche es unter der folgenden Lizenz:
w:de:Creative Commons
Namensnennung Weitergabe unter gleichen Bedingungen
Dieses Werk darf von dir
  • verbreitet werden – vervielfältigt, verbreitet und öffentlich zugänglich gemacht werden
  • neu zusammengestellt werden – abgewandelt und bearbeitet werden
Zu den folgenden Bedingungen:
  • Namensnennung – Du musst angemessene Urheber- und Rechteangaben machen, einen Link zur Lizenz beifügen und angeben, ob Änderungen vorgenommen wurden. Diese Angaben dürfen in jeder angemessenen Art und Weise gemacht werden, allerdings nicht so, dass der Eindruck entsteht, der Lizenzgeber unterstütze gerade dich oder deine Nutzung besonders.
  • Weitergabe unter gleichen Bedingungen – Wenn du das Material wiedermischst, transformierst oder darauf aufbaust, musst du deine Beiträge unter der gleichen oder einer kompatiblen Lizenz wie das Original verbreiten.

Dateiversionen

Klicke auf einen Zeitpunkt, um diese Version zu laden.

Version vomVorschaubildMaßeBenutzerKommentar
aktuell23:08, 3. Sep. 2021Vorschaubild der Version vom 23:08, 3. Sep. 202113.282 × 4.899 (7,76 MB)Frank Klemm (Diskussion | Beiträge)Uploaded own work with UploadWizard

Die folgende Seite verwendet diese Datei:

Globale Dateiverwendung

Die nachfolgenden anderen Wikis verwenden diese Datei: