// to find the most likely misalignment as it changes throughout the file.
#define NUM_THEORIES 200
-#define THEORY_FROM -10.0 /* in samples */
-#define THEORY_TO 10.0 /* in samples */
+#define THEORY_FROM -20.0 /* in samples */
+#define THEORY_TO 20.0 /* in samples */
#define SWITCH_COST 1000.0 /* pretty arbitrary */
#include <stdio.h>
struct stereo_sample {
short left, right;
};
-struct double_stereo_sample {
- double left, right;
+struct float_stereo_sample {
+ float left, right;
};
inline short clip(int x)
int main(int argc, char **argv)
{
+ make_lanczos_weight_table();
std::vector<stereo_sample> pcm;
while (!feof(stdin)) {
double inv_sd_left = 1.0 / sqrt(var_left);
double inv_sd_right = 1.0 / sqrt(var_right);
- std::vector<double_stereo_sample> norm;
+ std::vector<float_stereo_sample> norm;
norm.resize(pcm.size());
for (unsigned i = 0; i < pcm.size(); ++i) {
#endif
double delays[NUM_THEORIES];
+ std::vector<hypothesis *> alloc_hypot;
hypothesis *bases = new hypothesis[NUM_THEORIES];
+ alloc_hypot.push_back(bases);
for (int h = 0; h < NUM_THEORIES; ++h) {
delays[h] = THEORY_FROM + h * (THEORY_TO - THEORY_FROM) / (NUM_THEORIES - 1);
fprintf(stderr, "Matching blocks... %7.2f", 0.0);
hypothesis *prev_hyp = bases;
size_t total_end = pcm.size();
- //size_t total_end = 4410000;
+ //size_t total_end = 441000;
for (unsigned i = 0; i < total_end; i += BUFSIZE) {
fprintf(stderr, "\b\b\b\b\b\b\b%7.2f", i / 44100.0);
size_t end = std::min<size_t>(i + BUFSIZE, total_end);
hypothesis *hyp = new hypothesis[NUM_THEORIES];
+ alloc_hypot.push_back(hyp);
// evaluate all hypotheses
for (int h = 0; h < NUM_THEORIES; ++h) {
fprintf(fp, "%f %f\n", i * BUFSIZE / 44100.0, best_path[i]);
}
fclose(fp);
+
+ // save some RAM
+ norm = std::vector<float_stereo_sample>();
+ for (unsigned i = 0; i < alloc_hypot.size(); ++i) {
+ delete[] alloc_hypot[i];
+ }
fprintf(stderr, "Stretching right channel to match left... %7.2f%%", 0.0);
double inv_sd = sqrt(2.0) / sqrt(var_left + var_right);
std::vector<stereo_sample> aligned_pcm;
std::vector<short> mono_pcm;
+ aligned_pcm.resize(total_end);
+ mono_pcm.resize(total_end);
for (unsigned i = 0; i < total_end; ++i) {
- double d = linear_interpolate(best_path, i / double(BUFSIZE));
+ double d = lanczos_interpolate(best_path, i / double(BUFSIZE));
int left = pcm[i].left;
- int right = linear_interpolate_right(pcm, i + d);
+ int right = lanczos_interpolate_right(pcm, i + d);
- stereo_sample ss;
- ss.left = left;
- ss.right = clip(right);
- aligned_pcm.push_back(ss);
+ aligned_pcm[i].left = left;
+ aligned_pcm[i].right = clip(right);
- mono_pcm.push_back(clip(lrintf(inv_sd * 4096.0 * (left + right))));
+ mono_pcm[i] = clip(lrintf(inv_sd * 4096.0 * (left + right)));
if (i % 4096 == 0) {
fprintf(stderr, "\b\b\b\b\b\b\b\b%7.2f%%", 100.0 * i / total_end);