Basic Signal Cancellation/Comparison Program?

Status
Not open for further replies.

lychrel

Member
Hi!

This is my first Teensy program, and, though I can't yet test it on my Teensy (a component from my setup broke, and the replacement is still shipping), I'm sure I'm doing something obviously wrong, and I have a few questions.

I want to take two audio signals (one from each ADC), low-pass filter them, scale them so that they're of equal amplitude, then invert one and add it to the other. By going through and writing every bin-value below a threshold to zero, I was hoping this would allow me to "cancel" the noise in one signal with the inverted noise from the other (a control).

For one, how do I determine how much audio memory to allocate? Also, does this "scaling" I'm doing work as scaling, or does it simply mess up the data? What sort of other errors jump out as obvious to experienced programmers?

Thanks so much!

Code:
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SerialFlash.h>

// GUItool: begin automatically generated code
AudioInputAnalog         adc1;           //xy=82,93
AudioInputAnalog         adc2;           //xy=82,143
AudioAnalyzePeak         peak1;          //xy=243,26
AudioFilterStateVariable filter1;        //xy=249,97
AudioFilterStateVariable filter2;        //xy=250,163
AudioAnalyzePeak         peak2;          //xy=252,230
AudioAnalyzeFFT1024      fft1024_1;      //xy=433,86
AudioAnalyzeFFT1024      fft1024_2;      //xy=437,167
AudioConnection          patchCord1(adc1, peak1);
AudioConnection          patchCord2(adc1, 0, filter1, 0);
AudioConnection          patchCord3(adc2, peak2);
AudioConnection          patchCord4(adc2, 0, filter2, 0);
AudioConnection          patchCord5(filter1, 0, fft1024_1, 0);
AudioConnection          patchCord6(filter2, 0, fft1024_2, 0);
// GUItool: end automatically generated code

double scale_factor_1;

void setup() {

	AudioMemory(12); // how do I choose how much audio memory?

	fft1024_1.WindowFunction(AudioWindowHanning1024); // which window?
	fft1024_2.WindowFunction(AudioWindowHanning1024);

	scale_factor_1 = 0;

	filter1.frequency(1000);
	filter2.frequency(1000);

}

void loop() {

	// FIRST: SCALE PEAKS
	if (peak1.available() && peak2.available()) {
		scale_factor_1 *= (peak1.read() / peak2.read()); // ratio?
	} // peak, or peak-to-peak? I'm thinking the second...

	if (fft1024_1.available() && fft1024_2.available()) { // if these have 500+ bins why tf does the ex code only cycle through 40???
		for(int i = 0; i <= 511; i++){
			if ( abs( fft1024_1.read(i) * scale_factor_1 + fft1024_2.read(i) ) > 0.1 ) { // replace .01 with "SIGNIFICANT" defined static var.
				// implementation
			} //  Is it bad/incorrect to scale frequency bins in this manner?
		} 
	}
}
 
Hey, that's really cool! Thanks!

Basically I wanted to, after adding the one inverted signal to the normal one, check each frequency bin and see if there's any significant "difference" there between the two signals -- i.e., if the sum of them is some significant amount greater than 0, then one of them is detecting frequencies that the other isn't.
 
Status
Not open for further replies.
Back
Top