-
More test using Fourier Transform and Oscilloscope
05/29/2021 at 08:57 • 0 commentsI thought it would be a good idea to make some side by side comparisons of the unit operating inside a clutter room and outside, pointing up in the air. A digital high pass filter was used to set all the low frequency fundamentals and first set of harmonics on the FT to zero.
As can be seen, there are a couple of spikes about 1/3 of the way along the horizontal axis on the cluttered room FT that are different from the open air, but it's not particularly obvious. There should be more spikes beyond the 3m mark, which is about 1/2 way along the horizontal, but there's nothing there.
The varactor tuning pin was given a triangular voltage signal as shown below and there was no discernible difference between inside and outside:
I'm thinking that the IVS-362 is under powered and faulty :(
-
Diagnosing range issues
05/27/2021 at 10:39 • 0 commentsApparently the IVS-362 should have a range of 20m, so something is wrong!
These are some oscilloscope screenshots with the signal generator set to 200Hz with a voltage amplitude of 2.7 volts:
Channel IF1:
These readings were taken in a cluttered indoor environment with plenty of reflective objects in the 3 to 5 m range. But the module does not seem to be very responsive.
-
Static FMCW test with Fourier Transform
05/26/2021 at 16:23 • 0 commentsThe IVS-362 radar module was firstly calibrated by pointing it up into the air and then a 500mm x 500mm metal sheet was positioned about 3m directly in front of it. The FT graph above clearly shows a set of readings indicating distance. We expected the set of spikes on the graph to move to the right slightly as the metal sheet was moved away, but the maximum range seems to be 3 m.
-
Fourier Transform
05/12/2021 at 10:37 • 0 comments/* This example shows the most basic usage of the Adafruit ZeroFFT library. * it calculates the FFT and prints out the results along with their corresponding frequency * * The signal.h file constains a 200hz sine wave mixed with a weaker 800hz sine wave. * The signal was generated at a sample rate of 8000hz. * * Note that you can print only the value (coment out the other two print statements) and use * the serial plotter tool to see a graph. */ #include "Adafruit_ZeroFFT.h" #include "signal.h" //the signal in signal.h has 2048 samples. Set this to a value between 16 and 2048 inclusive. //this must be a power of 2 // #define DATA_SIZE 1024 #define DATA_SIZE 1024 // This is compatible with Arduino serial plotter where x axis ring buffer cant be changed from 500. // To make the actual plot, data size is reduced to 1000 and then divided by 2. // the sample rate: #define FS 39700 // Limited by speed of analogRead int16_t data[DATA_SIZE]; int16_t bigData[DATA_SIZE]; // the setup routine runs once when you press reset: void setup() { Serial.begin(115200); while(!Serial); //wait for serial to be ready /* // run the FFT ZeroFFT(signal, DATA_SIZE); // data is only meaningful up to sample rate/2, discard the other half for(int i=0; i<DATA_SIZE/2; i++) { //print the frequency //Serial.print(FFT_BIN(i, FS, DATA_SIZE)); //Serial.print(" Hz: "); //print the corresponding FFT output //Serial.println(signal[i]); } */ } void loop() { for(int i=0; i<DATA_SIZE; i++) { bigData[i] = 0; } int32_t avg = 0; unsigned long beforeMicros = micros(); int k = 50; for(int j=0; j<k; j++) { for(int i=0; i<DATA_SIZE; i++) { int16_t val = analogRead(A2); // delayMicroseconds(50); // delayMicroseconds(10); // ( 1u = 1MHz, 10u = 100 KHz, 100u = 10KHz) avg += val; data[i] = val; } unsigned long afterMicros = micros(); float totalMicros = afterMicros - beforeMicros; //remove DC offset and gain up to 16 bits avg = avg/DATA_SIZE; for(int i=0; i<DATA_SIZE; i++) data[i] = (data[i] - avg) * 64; //run the FFT ZeroFFT(data, DATA_SIZE); for(int i=0; i<DATA_SIZE; i++) { bigData[i] = data[i] + bigData[i]; } } int dataMax = 0; int dataMaxIndex = 600; for(int i=0; i<DATA_SIZE; i++) { data[i] = bigData[i]/k; // Find whichvalue of i gives the fundamental frequency: if(data[i] > dataMax) { dataMax = data[i]; dataMaxIndex = i; } } int fundamental_center = dataMaxIndex; int fundamental_1 = fundamental_center - 4; int fundamental_2 = fundamental_center - 3; int fundamental_3 = fundamental_center - 2; int fundamental_4 = fundamental_center - 1; int fundamental_5 = fundamental_center + 0; int fundamental_6 = fundamental_center + 1; int fundamental_7 = fundamental_center + 2; int fundamental_8 = fundamental_center + 3; int fundamental_9 = fundamental_center + 4; //data is only meaningful up to sample rate/2, discard the other half for(int i=0; i<(DATA_SIZE-24)/2; i++) // The '-24' is to try get the data to fit in Arduino serial plot window. { // Try and remove the fundamental frequency from the plot: if((i==fundamental_1)||(i==fundamental_2)||(i==fundamental_3)||(i==fundamental_4)||(i==fundamental_5)||(i==fundamental_6)||(i==fundamental_7)||(i==fundamental_8)||(i==fundamental_9)) { data[i] = 0; // Serial.println(data[i]); } if(data[i]<0) { data[i]=0; // Serial.print(" negative value detected at index: ");Serial.println(i); } // print the frequency // Serial.print(FFT_BIN(i, FS, DATA_SIZE)); // Serial.print(" Hz: "); // print the corresponding FFT output Serial.println(data[i]); } // delayMicroseconds(1000); // Serial.print(" Total micro seconds: ");Serial.println(totalMicros); // Serial.print(" Data size: ");Serial.println(DATA_SIZE); // Serial.print(" Time per analogRead: ");Serial.print(totalMicros/DATA_SIZE);Serial.println(" micro seconds"); // Serial.print(" analogRead frequency: ");Serial.print((1/((totalMicros/DATA_SIZE)/1000000))/1000);Serial.print(" KHz"); // Serial.print(" dataMaxIndex value: ");Serial.println(dataMaxIndex); // delay(1000); }
People might notice a rather clumsily coded high pass filter which takes out some of the frequency bands around the fundamental frequency. Needs to be improved with something a bit more elegant, I think. -
The Scope reveals all
05/10/2021 at 00:48 • 0 commentsThis is pretty much the expected result for non-Doppler static object detection, so all is good. Next task is to get this waveform into a RPi via an ADC without turning it into toast. Some lowering of the voltage and removal of DC offset may be required. Then, a bit of Fourier transform magick to pull out the hidden frequency and amplitude elelments.
-
Ready for Signal Processing
05/07/2021 at 09:47 • 0 commentsThe Radar module has been mounted on the DIY PCB with a 2 stage op amp for each signal output. Tested all ok. Great care needs to be taken to prevent damage to the module by static voltage. Next step is to hook up the oscilloscope and have a look at the output wave forms again.
-
PCB goes to Fab
04/25/2021 at 07:43 • 0 comments