diff options
author | H. Peter Anvin <hpa@zytor.com> | 2012-08-12 09:50:09 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2012-08-12 09:50:09 -0700 |
commit | 19f9717284a852044700c9f9b6bbb21b1504d47d (patch) | |
tree | e1e4eaeedcaff0c18b0fc3520b4b9f112acd8380 | |
parent | 93e99986f7bf536efccc092119b7ab2e74adf182 (diff) | |
download | mfmdecode-19f9717284a852044700c9f9b6bbb21b1504d47d.tar.gz mfmdecode-19f9717284a852044700c9f9b6bbb21b1504d47d.tar.xz mfmdecode-19f9717284a852044700c9f9b6bbb21b1504d47d.zip |
Make parameters adjustable
Adjusting parameters can result in more files being extractable
-rw-r--r-- | mfmdecode.c | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/mfmdecode.c b/mfmdecode.c index 6eeec0f..7cee0e4 100644 --- a/mfmdecode.c +++ b/mfmdecode.c @@ -1,14 +1,10 @@ /* - * Decode ABC80 cassette files (by H. Peter Anvin, - * modified by Mikael O. Bonnier 2012-07-23) + * Decode ABC80 cassette files * - * Convert to samples Hz single channel 16-bit with appropriate endianness + * Convert to 44100 Hz single channel 16-bit with appropriate endianness * and normalized gain first: * * sox muzak.wav --endian little -c 1 -s muzak.raw - * mfmdecode muzak.raw 44100 5300 - * - * This program doesn't work with 96 kHz. */ #include <stdio.h> @@ -17,10 +13,7 @@ #include <math.h> #include <inttypes.h> -static unsigned int thresh; /* threshold e.g. 5300 */ -static unsigned int samples; /* sample frequency in Hz e.g. 44100 or 96000 -*/ -static unsigned int xtime; /* samples/baud */ +static unsigned int xtime; static const char my_tolower[256] = "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" @@ -76,12 +69,12 @@ static void output_block(uint8_t *buf, uint8_t *csum) csum1 = 0x03; /* Checksum includes ETX */ for (i = 0; i < 256; i++) csum1 += buf[i]; - + if (csum1 == csum2) { if (!memcmp(buf, "\xff\xff\xff", 3)) { if (f) fclose(f); - + unmangle_filename(filename, buf+3); f = fopen(filename, "wb"); if (!f) { @@ -224,24 +217,27 @@ static void process_flank(unsigned int time) int main(int argc, char *argv[]) { + unsigned int frequency; FILE *f; int16_t samp, osamp; - double v; + double v, k, cutoff, thresh; unsigned int state; unsigned int time, ptime; - double k; f = fopen(argv[1], "rb"); - sscanf(argv[2], "%u", &samples); - sscanf(argv[3], "%u", &thresh); - xtime = samples/700; - k = exp(-10000.0/samples); + + frequency = (argc > 2) ? strtoul(argv[2], NULL, 0) : 44100; + thresh = (argc > 3) ? atof(argv[3]) : 5300.0; + cutoff = (argc > 4) ? atof(argv[4]) : 0.0; + + k = exp(-cutoff/frequency); + xtime = frequency/700; /* Samples per baud */ + state = time = ptime = 0; samp = osamp = 0; v = 0.0; while (fread(&samp, 1, 2, f) == 2) { - /* Emulate high pass filter in ABC80 */ v = (v * k) + (samp - osamp); osamp = samp; |