So I measured something the other day that I couldn't quite get my head around. I've convinced myself that I should be able to explain it, so I wasn't going to post on here bothering everyone about it, but I'm really stumped so here goes:
Basically, I set up a simple test to do some frequency analysis on an STM32F446 ADC. I was able to get my hands on an SRS signal generator, and connected it to the ADC. I set up the signal generator for a 1.65V bias Voltage and approximately 1V-pk 1kHz sine wave. I set up the ADC to run at either 48kHz or 384kHz. I wrote an application to capture a bunch of data (4K and 32K respectively) at the different sample rates and dump the data through a serial connection to my PC. Finally, I ran the data through a windowed FFT and plotted the results.
So everything seemed mostly to fall within what I expected: I saw the noise floor, the DC component, the 1kHz peak and the harmonics from the quantization. But I also saw a consistent peak (i.e. at both sample rates) in the spectrum at 500Hz, approximately 60dB lower than the 1kHz peak. I tried my best to ignore it in the interest of finishing out the rest of my experiment, but it's really bothering me.
I have always maintained that a time-invariant non-linear distortion could only create harmonics of the fundamental, as well as DC, when acting on a sine wave. Obviously, there can be intermodulation distortion for multiple sine waves, but given that I couldn't observe any other peaks besides the fundamental, I'm not sure where the content would come from to create any IMD.
I'm wondering if anyone here has any thoughts on how a sub-multiple harmonic could be generated? I honestly can't even think of a way to do it intentionally without getting into crafty system components like PLLs, phase-vodocers, etc., which I can't imagine happening by accident.
Any thoughts are greatly appreciated! (ps. I haven't ruled out that it wasn't either a mistake on my end or something coming from the signal generator itself, I'm really just curious if someone might chime in with a "Oh, when blah blah blah, that always happens")
Couple of questions/ideas:
What happens when you change the level of the signal generator? Does the mystery component change level too?
What happens when you change the frequency, going either lower or higher? Make sure to include frequencies that are not integer related to the sample rate.
Use a triangle wave and check that everything in monotonic and your capture routine isn't messing up a few LSBs.
Use a different generator. Even PC sounds cards should have harmonics < 80 dB down (and more likely < 90 dB), way better than a 12 bit ADC. AC couple with a decent quality film cap so you can apply a DC offset to match your ADC input.
Gold Star! I didn't even think to try my sound card. You just saved me an hour's travel time to/from the lab I've been using to perform experiments!
I absolutely need to try varying the input signal conditions.
Google parametric oscillation and subharmonic oscillation. It's a thing. I suspect it's not what you're seeing, and I'd look for other things first -- but who knows? -60dBc means that it doesn't have to be a big effect causing it.
And watch this video. Because it's fun, even if the lead-in is too slow (I've fixed that on later videos).
Thanks Tim! I'll be sure to re-watch it, it's good of you to put these videos together.
Hello dszabo. Good for you NOT ignoring an anomaly that you could have just as well ignored. I wonder, does the unwanted 500 Hz spectral component appear at different A/D sample rates? If so, my first guess would be that your analog 1000 Hz input is slightly distorted and it also contains a low-level 500 Hz spec component.
You might set your Fs sample rate to 200 Hz (undersampling) and locate and identify that unwanted aliased "originally 500 Hz" spectral component. Then change your Fs sample rate to 300 Hz and again locate and identify that unwanted aliased "originally 500 Hz" spectral component. At those two undersampling sample rates did the frequency of that "originally 500 Hz" spectral component change? If so, then I believe the "originally 500 Hz" spectral component exists in your analog signal and is not being generated by your A/D converter.
Also, I wonder if your SRS signal generator is an analog generator or is it a direct digital synthesizer (DDS) signal generator. I ask that because months ago I saw an article where a DDS signal generator was supposed to output a 50 MHz sine wave, but that 50 MHz sine wave was contaminated by an unexplained 25 MHz subharmonic sine wave. I e-mailed the article's author but he was unable to explain the existence of the unwanted 25 MHz spec component in his DDS analog output. Check out Figure 4 at:
Rick, that's a great idea to try the undersampling to isolate the anomaly, I'll be sure to give it a try! That's fascinating that the AD DDS could have a similar sub-harmonic like that, I've always held AD in high regard (just maybe SRS does too?)... I suppose it would at least be reasonable to hypothesize that it could be a component of the analog signal.
Changing the source frequency, both by a bit and by a lot may also be informative.
I have a couple of guesses:
 zero-cross distortion - can be due to CMOS inputs or outputs whose P/N transistors don't switch "perfectly".
 if there is some one-sided compression (e.g. the peaks), then this acts like partial rectification which creates a subharmonic of the fundamental in addition to a 2nd harmonic.
For the latter, decreasing the amplitude to about 80% of FS should eliminate most of the subharmonic. If it's zero-cross, then making the signal smaller should make the subharmonic relatively larger.
This is the audio guy coming out in me, but are  and  the same as Crossover Distortion and Asymmetrical Clipping? If so, I don't understand how that could result in components below the fundamental. Is that something that could be modeled in MATLAB/Python/a spreadsheet? I'd be willing to try it if you have any ideas on how to model it.