Exemplo n.º 1
0
Arquivo: dsp.c Projeto: bkerler/aptdec
int getpixelrow(float *pixelv)
{
    static float pixels[PixelLine + SyncFilterLen];
    static int npv = 0;
    static int synced = 0;
    static double max = 0.0;

    double corr, ecorr, lcorr;
    int res;

    if (npv > 0)
	memmove(pixelv, pixels, npv * sizeof(float));
    if (npv < SyncFilterLen + 2) {
	res = getpixelv(&(pixelv[npv]), SyncFilterLen + 2 - npv);
	npv += res;
	if (npv < SyncFilterLen + 2)
	    return (0);
    }

    /* test sync */
    ecorr = fir(pixelv, Sync, SyncFilterLen);
    corr = fir(&(pixelv[1]), Sync, SyncFilterLen);
    lcorr = fir(&(pixelv[2]), Sync, SyncFilterLen);
    FreqLine = 1.0+((ecorr-lcorr) / corr / PixelLine / 4.0);
    if (corr < 0.75 * max) {
	synced = 0;
	FreqLine = 1.0;
    }
    max = corr;
    if (synced < 8) {
	int shift, mshift;

	if (npv < PixelLine + SyncFilterLen) {
	    res =
		getpixelv(&(pixelv[npv]), PixelLine + SyncFilterLen - npv);
	    npv += res;
	    if (npv < PixelLine + SyncFilterLen)
		return (0);
	}

	/* lookup sync start */
	mshift = 0;
	for (shift = 1; shift < PixelLine; shift++) {
	    double corr;

	    corr = fir(&(pixelv[shift + 1]), Sync, SyncFilterLen);
	    if (corr > max) {
		mshift = shift;
		max = corr;
	    }
	}
	if (mshift != 0) {
	    memmove(pixelv, &(pixelv[mshift]),
		    (npv - mshift) * sizeof(float));
	    npv -= mshift;
	    synced = 0;
	    FreqLine = 1.0;
	} else
	    synced += 1;
    }
    if (npv < PixelLine) {
	res = getpixelv(&(pixelv[npv]), PixelLine - npv);
	npv += res;
	if (npv < PixelLine)
	    return (0);
    }
    if (npv == PixelLine) {
	npv = 0;
    } else {
	memmove(pixels, &(pixelv[PixelLine]),
		(npv - PixelLine) * sizeof(float));
	npv -= PixelLine;
    }

    return (1);
}
Exemplo n.º 2
0
Arquivo: apt.cpp Projeto: la1k/wxfetch
int apt_decode(apt_t *apt, buffer_t *sound_buffer, float *pixels_out)
{
    double corr, ecorr, lcorr;
    float pixelv[APT_IMG_WIDTH + SyncFilterLen] = {};
    int res;
    int npv = apt->num_leftover_pixels;
    if (apt->num_leftover_pixels > 0) {
	memmove(pixelv, apt->leftover_pixels, npv * sizeof(float));
	apt->num_leftover_pixels = 0;
    }
    if (npv < SyncFilterLen + 2) {
	res = getpixelv(sound_buffer, apt, &(pixelv[npv]), SyncFilterLen + 2 - npv);
	npv += res;
	if (npv < SyncFilterLen + 2)
	    return (0);
    }

    /* test sync */
    corr = fir(&(pixelv[1]), Sync, SyncFilterLen);
    ecorr = fir(pixelv, Sync, SyncFilterLen);
    lcorr = fir(&(pixelv[2]), Sync, SyncFilterLen);
    apt->FreqLine = 1.0 + (ecorr - lcorr) / corr / APT_IMG_WIDTH / 4.0;
    if (corr <= 0.75 * apt->last_max_correlation) {
	apt->synced = 0;
	apt->FreqLine = 1.0;
    }
    apt->last_max_correlation = corr;
    if (apt->synced < 8) {
	int shift, mshift;

	if (npv < APT_IMG_WIDTH + SyncFilterLen) {
	    res =
		getpixelv(sound_buffer, apt, &(pixelv[npv]), APT_IMG_WIDTH + SyncFilterLen - npv);
	    npv += res;
	    if (npv < APT_IMG_WIDTH + SyncFilterLen)
		return (0);
	}

	/* lookup sync start */
	mshift = 0;
	for (shift = 1; shift < APT_IMG_WIDTH; shift++) {
	    double corr;

	    corr = fir(&(pixelv[shift + 1]), Sync, SyncFilterLen);
	    if (corr > apt->last_max_correlation) {
		mshift = shift;
		apt->last_max_correlation = corr;
	    }
	}
	if (mshift != 0) {
	    memmove(pixelv, &(pixelv[mshift]),
		    (npv - mshift) * sizeof(float));
	    npv -= mshift;
	    apt->synced = 0;
	    apt->FreqLine = 1.0;
	} else
	    apt->synced += 1;
    }
    if (npv < APT_IMG_WIDTH) {
	res = getpixelv(sound_buffer, apt, &(pixelv[npv]), APT_IMG_WIDTH - npv);
	npv += res;
	if (npv < APT_IMG_WIDTH)
	    return (0);
    }
    if (npv == APT_IMG_WIDTH) {
	npv = 0;
    } else {
	memmove(apt->leftover_pixels, &(pixelv[APT_IMG_WIDTH]),
		(npv - APT_IMG_WIDTH) * sizeof(float));
	apt->num_leftover_pixels = npv - APT_IMG_WIDTH;
    }
    
    memcpy(pixels_out, pixelv, APT_IMG_WIDTH*sizeof(float));

    return (1);
}