record series of frequencies into file, then read file on spectrogram
    5 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
Hi, I have a problem that I cannot find a solution to on the forums. 
I have a for loop that controls the pitch of a sinusoidal waveform, which then plays. it plays a series of notes. 
I need to record the entire audio signal, then plot it on a spectrogram. but i am not sure how to do this. 
any ideas? 
thanks 
the function: 
%define function
function tonegen = tone(samp, fref, decay, index)
    %take inputs and set them to local variables
    i = index;
    fs = samp; %sets sampling rate
    fref = fref*2^(2*(i)/24);
    dec = decay; %determines the time length of the signal
    t = (0:round(decay*fs)-1)/fs;
    %define signal
    tonegen = cos(2*pi*fref*t);
    %signal playback
   % soundsc(tonegen,fs)
end
%loop that plays through a hexaconic scale starting at A4 (440Hz)
fs = 4000;
wen = 128;
nfft = 1024;
olap = floor(wen/2);
wn = hamming(wen);
fref = 256;
t = (0:1);
loop that plays through a hexaconic scale starting at A4 (440Hz)
for j=0:23 %sets the range from 0 (reference) to 6 (scale completion)
    sig = tone(fs,256,0.1,j) %calls the signal generation function
    pause(0.25) %spaces the notes out to prevent overlap
    record(audio,5);
    soundsc(sig,fs);
end
testsig = cos(2*pi*fref*t);
[b,faxis,taxis] = spectrogram(testsig,wn,olap,nfft,fs);
figure(1); imagesc(taxis, faxis, abs(b)) % Plot spectrogram
axis('xy') % Flip y axis to put zero Hz on bottom
0 Kommentare
Antworten (1)
  Mathieu NOE
      
 am 10 Okt. 2023
        hello my friend 
here you are 
I simplified a bit your function (ne need to create extra variables that we don't use anyway) and to solve your main problem, I simply created a concatenation of your individual tones plus the 0.25s silence in between 
%loop that plays through a hexaconic scale starting at A4 (440Hz)
fs = 4000;
fref = 256;
t = (0:1);
testsig = []; % this will be your final signal including all tones + silences
%loop that plays through a hexaconic scale starting at A4 (440Hz)
for k=0:23 %sets the range from 0 (reference) to 6 (scale completion)
    sig = tone(fs,256,0.1,k) %calls the signal generation function
%     pause(0.25) %spaces the notes out to prevent overlap
%     soundsc(sig,fs);
    testsig = [testsig; zeros(round(0.25*fs),1);sig]; % concatenate signal (sig) + silence of 0.25 s 
end
soundsc(testsig,fs);
% spectrogram
wen = 128;
nfft = 1024;
olap = floor(wen/2);
wn = hamming(wen);
[b,faxis,taxis] = spectrogram(testsig,wn,olap,nfft,fs);
figure(1); imagesc(taxis, faxis, abs(b)) % Plot spectrogram
axis('xy') % Flip y axis to put zero Hz on bottom
%define function
function tonegen = tone(fs, fref, decay, index)
    %take inputs and set them to local variables
    fref = fref*2^(2*(index)/24);
    t = (0:round(decay*fs)-1)'/fs;
    %define signal
    tonegen = sin(2*pi*fref*t);
end
1 Kommentar
  Mathieu NOE
      
 am 11 Dez. 2023
				hello again
do you mind accepting my answer (if it has fullfiled your expectations ) ? tx
Siehe auch
Kategorien
				Mehr zu Time-Frequency Analysis finden Sie in Help Center und File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!