How can I generate sinusoidal signal with a time-varying frequency?

25 vues (au cours des 30 derniers jours)
인성 이
인성 이 le 16 Août 2022
Modifié(e) : 인성 이 le 16 Août 2022
Hi. I want to generate time-varying frequency signal.
I have frequency data per every time sample.
For example, for a 1 second time duration signal with a sampling frequency of 100 Hz, I have 100 frequency values.
The picture above is showing the frequency data per time sample that I actually have. It is a signal of 0.85 seconds sampled at 100 kHz.
I want to get a spectrogram by making sound data from this value, but something goes wrong.
Down below is the code I made and the result. I'm not sure where I went wrong in the code.
clc;clear all;close all;
fs = 100e3; % 100kHz sampling frequency
ts = 1/fs;
Time = ts:ts:84986*ts; % 0.84986 sec
load('Freq.mat'); % 84.986 frequency value
Signal = cos(2*pi*Freq.*Time) + 1j*sin(2*pi*Freq.*Time); % generating signal
[s,ff,ttt] = spectrogram(y,1024,800,1024,fs);
s = abs(s);
%% ploting spectrogram of Signal
X = figure;
axes1 = axes('Parent',X);
imagesc(ttt,ff,s);
set(axes1,'YDir','normal');
axis([ttt(1) ttt(end) 4e3 17e3]);xlabel('sec');ylabel('Hz');
The above spectrogram figure is the result of the generated spectrogram. As you can see, the signal was generated a lot different from the frequency data I had.
Please help. Thanks.

Réponse acceptée

Chunru
Chunru le 16 Août 2022
Modifié(e) : Chunru le 16 Août 2022
fs = 100e3; % 100kHz sampling frequency
ts = 1/fs;
Time = ts:ts:84986*ts; % 0.84986 sec
load('Freq.mat'); % 84.986 frequency value
figure;
plot(Time, Freq);
You need to integrate the instantaneous fre quency over time:
where is the time-varying phase and is the instantaneous frequency. The signal can be then expressed as:
phase = 2*pi*cumsum(Freq)/fs;
% Signal = cos(2*pi*Freq.*Time) + 1j*sin(2*pi*Freq.*Time); % generating signal
Signal = exp(1j*phase);
[s,ff,ttt] = spectrogram(Signal,1024,800,1024,fs);
s = abs(s);
%% ploting spectrogram of Signal
X = figure;
axes1 = axes('Parent',X);
imagesc(ttt,ff,s);
set(axes1,'YDir','normal');
axis([ttt(1) ttt(end) 4e3 17e3]);xlabel('sec');ylabel('Hz');
  1 commentaire
인성 이
인성 이 le 16 Août 2022
Modifié(e) : 인성 이 le 16 Août 2022
Thank you so much for your kind reply. It really helped me a lot.

Connectez-vous pour commenter.

Plus de réponses (0)

Produits


Version

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by