Nog een paar testjes,
Dit is een 1024 punts FFT met een overlap van 128 samples. Hier is een een 8 bit ADC gesimuleerd met een Vref van 3.3volt. Het signaal zelf bevat een 2Volt DC amplitude met een 10mV of 20mv sinus.
Dit wil zeggen dat er wanneer 128 nieuwe samples binnen komen er opnieuw de fft word berekend van de laatste 1024 samples. Hier door kun je beter in het tijdsdomein bekijken.
Je ziet hier in het begin verschillende signalen:
-2 seconden 10mV @ 10Hz
-3 seconden 20mV @ 100Hz
-2 seconden 10mV @ 10Hz
-3 seconden 10mV @ 100Hz
Dus door het opsplitsen in kleinere delen krijg je een beter overzicht van wat er gebeurt. Hoe meer overlap je toe laat, hoe sneller je nieuwe signale gaat zien.
@YokoTsuno
Zo je kunt zien zie je wel degelijk dat er een sinus in het signaal zit "onder het ruis niveau". We weten dat het gemiddelde van ruis 0 is. En ruis nergens correleerde. Jouw formule is correct als je elke sample wilt zeker zij dat je nog het signaal kan vinden. Als je correlatie wilt bekijken is deze regel wat lakser.
Een STM32 microcontroller ( een cortex M3 arm die draait op 72MHz) kan een 1024 punt FFT berekenen in ongeveer 2ms. Als we met 128 samples overlap werken is er ongeveer 125ms tussen elke FFT berekening wat meer dan genoeg is voor die microcontroller.
Wat ben je met een analoge filter? Je moet nog steeds het signaal er uithalen. Hoe behandeld de filter ruis?
De matlab code:
code:
%DEMO CO
clc; clear all; close all;
sr = 1024; %samples per seconde
t_max = 10; %seconde
t = 1:(sr*t_max);
t1 = 1:(sr*2);
t2 = 1:(sr*3);
t3 = 1:(sr*2);
t4 = 1:(sr*3);
signaal = 2 + randn(1,length(t))*0.01;
signaal_gen = [ 0.01*sin(t1/1024*10*2*pi) 0.02*sin(t2/1024*100*2*pi) 0.01*sin(t3/1024*20*2*pi) 0.01*sin(t4/1024*100*2*pi)]
signaal = signaal_gen + signaal;
% 2 Volt amplitude, 0.01V signaal 10Hz
figure();
plot(t,signaal,t,0);
SIGNAAL = abs(fft(signaal(1:1024))); %FFT berekenen
SIGNAAL(1) = 0; %DC er uit gooien
figure();
plot(SIGNAAL);
%Quantiseren met 8 bits
%ADC met VREF = 3.3Volt
u8signaal = uint8((signaal/3.3)*256);
figure();
plot(t,u8signaal,t,0);
U8SIGNAAL = abs(fft(u8signaal(1:1024))); %FFT berekenen
U8SIGNAAL(1) = 0; %DC er uit gooien
figure();
plot(U8SIGNAAL);
OVERLAP = 128;
k = 1;
l = 1;
while l < (sr*t_max-sr)
specto(k,1:sr) = abs(fft(u8signaal(l:(l+sr-1))));
specto(k,1) = 0;
l = OVERLAP + l;
k = k + 1;
end
figure();
surf(specto);