Sinewave with log frequency - Shows the wrong frequency content
30 次查看(过去 30 天)
显示 更早的评论
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 个评论
采纳的回答
Mathieu NOE
2024-11-5,12:34
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 个评论
Mathieu NOE
2024-11-5,15:54
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
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Spectral Measurements 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!