Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>The plot shows time along the horizontal axis, and frequency along the vertical axis. With pixel color showing the intensity of each frequency at each time.</p> <p>A spectrogram is generated by taking a signal and chopping it into small time segments, doing a Fourier series on each segment.</p> <p>here is some matlab code to generate one.</p> <p>Notice how plotting the signal directly, it looks like <em>garbage</em>, but plotting the spectrogram, we can clearly see the frequencies of the component signals.</p> <pre><code>%%%%%%%% %% setup %%%%%%%% %signal length in seconds signalLength = 60+10*randn(); %100Hz sampling rate sampleRate = 100; dt = 1/sampleRate; %total number of samples, and all time tags Nsamples = round(sampleRate*signalLength); time = linspace(0,signalLength,Nsamples); %%%%%%%%%%%%%%%%%%%%% %create a test signal %%%%%%%%%%%%%%%%%%%%% %function for converting from time to frequency in this test signal F1 = @(T)0+40*T/signalLength; #frequency increasing with time M1 = @(T)1-T/signalLength; #amplitude decreasing with time F2 = @(T)20+10*sin(2*pi()*T/signalLength); #oscilating frequenct over time M2 = @(T)1/2; #constant low amplitude %Signal frequency as a function of time signal1Frequency = F1(time); signal1Mag = M1(time); signal2Frequency = F2(time); signal2Mag = M2(time); %integrate frequency to get angle signal1Angle = 2*pi()*dt*cumsum(signal1Frequency); signal2Angle = 2*pi()*dt*cumsum(signal2Frequency); %sin of the angle to get the signal value signal = signal1Mag.*sin(signal1Angle+randn()) + signal2Mag.*sin(signal2Angle+randn()); figure(); plot(time,signal) %%%%%%%%%%%%%%%%%%%%%%% %processing starts here %%%%%%%%%%%%%%%%%%%%%%% frequencyResolution = 1 %time resolution, binWidth, is inversly proportional to frequency resolution binWidth = 1/frequencyResolution; %number of resulting samples per bin binSize = sampleRate*binWidth; %number of bins Nbins = ceil(Nsamples/binSize); %pad the data with zeros so that it fills Nbins signal(Nbins*binSize+1)=0; signal(end) = []; %reshape the data to binSize by Nbins signal = reshape(signal,[binSize,Nbins]); %calculate the fourier transform fourierResult = fft(signal); %convert the cos+j*sin, encoded in the complex numbers into magnitude.^2 mags= fourierResult.*conj(fourierResult); binTimes = linspace(0,signalLength,Nbins); frequencies = (0:frequencyResolution:binSize*frequencyResolution); frequencies = frequencies(1:end-1); %the upper frequencies are just aliasing, you can ignore them in this example. slice = frequencies&lt;max(frequencies)/2; %plot the spectrogram figure(); pcolor(binTimes,frequencies(slice),mags(slice,:)); </code></pre> <p>The inverse Fourier transform of the <code>fourierResult</code> matrix, will return the original signal.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload