SignalLab2/record_vocoder.m

105 lines
2.5 KiB
Matlab

function record_vocoder()
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Task: To apply a vocoder on a recorded signal.
%
% Inputs: -
%
% Outputs: -
%
%
% Author: Improved using
% vocoder.m
% code by : Guillaume Gibert - guillaume.gibert@ecam.fr
%
% Modified by : Charles Stelandre - charles.stelandre@ecam.fr
%
% Date: 04/05/2025
%
% Notes : This code records an audio and applies a vocoder on this
% recording. Also plots the temporal plots and spectrograms. Problems
% occured to use the record() functions. An alternative involved using the
% recorder object.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all
close all
clc
duration = 3; % Recording duration in seconds
sr = 22050; % Sample rate (Hz)
nb_bands = 16;
overlap = 0.1;
numChannels = 1; % Mono recording
disp('Press any key to start recording for 3 seconds...');
pause;
% Create an audiorecorder object
recorder = audiorecorder(sr, nb_bands, numChannels);
disp('Recording...');
record(recorder, duration); % Start recording for the specified duration
pause(duration + 0.5); % Wait for the recording to finish (with a buffer)
disp('Recording finished!');
% Get the recorded audio data
modulator = getaudiodata(recorder);
sound(modulator,sr)
pause(duration);
% Remove the first tenth of a second
%modulator(1:floor(sr/10)) = [];
% Load carrier signal
carfile = 'sound/white_periodic.wav';
[carrier, sr2] = audioread(carfile);
if sr~=sr2, disp('your sampling rates dont match'); end
% Apply channel vocoder
nb_channels = floor(sr/15);
disp('Computing channel vocoder...');
robotic_voice = chanvocoder(carrier, modulator, nb_channels, nb_bands, overlap);
% Display time domain plots
figure;
subplot(2,1,1);
plot(robotic_voice);
title('Vocoded Sound');
xlabel('Time (samples)');
ylabel('Amplitude');
subplot(2,1,2);
plot(modulator);
title('Recorded Sound (Modulator)');
xlabel('Time (samples)');
ylabel('Amplitude');
% Play the robotic voice
disp('Playing vocoder...');
sound(robotic_voice,sr)
%pause(duration*2);
% temporal plots
figure;
subplot(3,1,1);
plot(modulator);
title("modulator")
ylabel('Amplitude (a.u.)');
subplot(3,1,2);
plot(carrier);
title("carrier")
ylabel('Amplitude (a.u.)');
subplot(3,1,3);
plot(robotic_voice);
title("Robotic voice")
ylabel('Amplitude (a.u.)');
xlabel('Time (sample)');
% spectrogram plots
step_size = 5; % In ms
window_size = 30; %In ms
spectrogram(modulator, sr, step_size, window_size);
spectrogram(carrier, sr, step_size, window_size);
spectrogram(robotic_voice, sr, step_size, window_size);