Sinewave with log frequency - Shows the wrong frequency content
2 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
Djamil Boulahbal
il 24 Ott 2024
Commentato: Djamil Boulahbal
il 5 Nov 2024
I'm struggling with a rather basic problem. I create a sinewave with a continuously increasing frequency:
NPTS=500000;
A=(log(50)-log(7))/450;
time = linspace(0,450,NPTS)';
freq = 7*exp(A*time); % The frequency varies from 7 to 50 Hz
Y = sin(2*pi*freq.*time);
Then, when I do an FFT vs. Time of the Y trace, I find that the highest frequency in the signal is close to 150 Hz.
What am I missing here?
0 Commenti
Risposta accettata
Mathieu NOE
il 5 Nov 2024
hello
you have to compute the angle increment vs time then take the sine of that angle (or, in other words, do the integral of the time varying frequency and then take the sine of that angle )
NPTS=500000;
t_final = 450;
A=(log(50)-log(7))/t_final;
time = linspace(0,t_final,NPTS)';
dt = mean(diff(time));
fs = 1/dt
freq = 7*exp(A*time); % The frequency varies from 7 to 50 Hz
freq(1)
freq(end)
ang = cumsum(2*pi*freq)*dt; % integral of the time varying frequency
Y = sin(ang);
% spectrogram plot
nfft = 1000;
overlap = 0.75; % 75% overlap
spectrogram(Y,hanning(nfft),round(overlap*nfft),nfft,fs,'yaxis')
ylim([0 100])
3 Commenti
Mathieu NOE
il 5 Nov 2024
hello again
yes this is the usual remark when someone tries to generate variable frequency signals (sweeps)
always remember you are dealing with variable frequency and what you want at the end is the sine of an angle (not a frequency)
if your frequency is steady , you can write Y = sin(2*pi*freq.*time);
but if you have a variable frequency, start with the equation that describes how this frequency varies , multiply by 2*pi to convert to pulsation and then time integrate to get the angle
Più risposte (0)
Vedere anche
Categorie
Scopri di più su Digital Filter Design in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
