X-Git-Url: https://git.sesse.net/?p=c64tapwav;a=blobdiff_plain;f=decode.cpp;h=e3ec6775161edf854b2522c99dd9eb724e60af27;hp=798a8729447ab143e51b3fd1bb9f1a11dad572be;hb=9e9da751d8df66b61d930cdf643c65c61ebb4f8a;hpb=35d290f19c02f0e884f4baec704851cfd1b86988 diff --git a/decode.cpp b/decode.cpp index 798a872..e3ec677 100644 --- a/decode.cpp +++ b/decode.cpp @@ -125,10 +125,31 @@ int main(int argc, char **argv) // Find the flanks. int last_bit = -1; double last_upflank = -1; - int last_max_level = 0; for (unsigned i = 0; i < pcm.size(); ++i) { int bit = (pcm[i] > 0) ? 1 : 0; - if (bit == 1 && last_bit == 0 && last_max_level > HYSTERESIS_LIMIT) { + if (bit == 1 && last_bit == 0) { + // Check if we ever go up above HYSTERESIS_LIMIT before we dip down again. + bool true_pulse = false; + unsigned j; + int max_level_after = -32768; + for (j = i; j < pcm.size(); ++j) { + max_level_after = std::max(max_level_after, pcm[j]); + if (pcm[j] < 0) break; + if (pcm[j] > HYSTERESIS_LIMIT) { + true_pulse = true; + break; + } + } + + if (!true_pulse) { +#if 0 + fprintf(stderr, "Ignored up-flank at %.6f seconds due to hysteresis (%d < %d).\n", + double(i) / SAMPLE_RATE, max_level_after, HYSTERESIS_LIMIT); +#endif + i = j; + continue; + } + // up-flank! double t = find_zerocrossing(pcm, i - 1) * (1.0 / SAMPLE_RATE); if (last_upflank > 0) { @@ -138,9 +159,7 @@ int main(int argc, char **argv) pulses.push_back(p); } last_upflank = t; - last_max_level = 0; } - last_max_level = std::max(last_max_level, abs(pcm[i])); last_bit = bit; } @@ -178,9 +197,11 @@ int main(int argc, char **argv) stddev); } + FILE *fp = fopen("cycles.plot", "w"); std::vector tap_data; for (unsigned i = 0; i < pulses.size(); ++i) { double cycles = pulses[i].len * calibration_factor * C64_FREQUENCY; + fprintf(fp, "%f %f\n", pulses[i].time, cycles); int len = lrintf(cycles / TAP_RESOLUTION); if (i > SYNC_PULSE_END && (cycles < 100 || cycles > 800)) { fprintf(stderr, "Cycle with upflank at %.6f was detected at %.0f cycles; misdetect?\n", @@ -196,6 +217,7 @@ int main(int argc, char **argv) tap_data.push_back(overflow_len >> 16); } } + fclose(fp); tap_header hdr; memcpy(hdr.identifier, "C64-TAPE-RAW", 12);