Main Content

Extract Voices from Music Signal

Implement a basic digital music synthesizer and use it to play a traditional song in a three-voice arrangement. Specify a sample rate of 2 kHz. Save the song as a MATLAB® timetable.

fs = 2e3;
t = 0:1/fs:0.3-1/fs; fq = [-Inf -9:2]/12;
note = @(f,g) [1 1 1]*sin(2*pi*440*2.^[fq(g)-1 fq(g) fq(f)+1]'.*t);

mel = [5 3 1 3 5 5 5 0 3 3 3 0 5 8 8 0 5 3 1 3 5 5 5 5 3 3 5 3 1]+1;
acc = [5 0 8 0 5 0 5 5 3 0 3 3 5 0 8 8 5 0 8 0 5 5 5 0 3 3 5 0 1]+1;

song = [];
for kj = 1:length(mel)
    song = [song note(mel(kj),acc(kj)) zeros(1,0.01*fs)];
end
song = song'/(max(abs(song))+0.1);

% To hear, type sound(song,fs)

tune = timetable(song,SampleRate=fs);

Open Signal Analyzer and drag the timetable from the Workspace Browser to the Signal table. Click Display Grid to create a two-by-two grid of displays. Add a spectrum view to the top two displays and the lower left display. Select the lower right display, click Time-Frequency to add a spectrogram view, and click Time to remove the time view. Drag the song to all four displays. Select the lower right display, and on the Spectrogram tab, specify a time resolution of 0.31 second and 0% overlap between adjoining segments. Set the Power Limits to –50 dB and –10 dB.

Signal Analyzer window showing three copies of the waveform and spectrum of a music signal. A fourth display shows the spectrogram of the signal.

On the Analyzer tab, click Duplicate three times to create three copies of the song. Rename the copies as high, medium, and low by double-clicking the Name column in the Signal table. Move the copies to the top two and lower left displays.

Select all three duplicate signals in the Signal table and click Preprocess to enter the preprocessing mode.

  1. Select the high signal by clicking its name in the Signal table. Select Highpass from the Functions gallery. In the Function Parameters panel, enter a passband frequency of 450 Hz and increase the steepness to 0.95. Click Apply.

  2. Select the medium signal by clicking its name in the Signal table. Select Bandpass from the Functions gallery. In the Function Parameters panel, enter 230 Hz and 450 Hz as the lower and upper passband frequencies, respectively. Increase the steepness to 0.95. Click Apply.

  3. Select the low signal by clicking its name in the Signal table. Select Lowpass from the Functions gallery. In the Function Parameters panel, enter a passband frequency of 230 Hz and increase the steepness to 0.95. Click Apply.

Click Accept All to save the preprocessing results and exit the mode.

Signal Analyzer window showing highpass-filtered, bandpass-filtered, and lowpass-filtered copies of a music signal

View a spectrogram on each of the three displays containing filtered signals.

  1. Remove the original signal by clearing the check box next to its name.

  2. On the Display tab, click Time-Frequency to add a spectrogram view and click Time to remove the time view.

  3. On the Spectrogram tab, specify a time resolution of 0.31 second and 0% overlap between adjoining segments. Set the Power Limits to –50 dB and –10 dB.

Signal Analyzer window showing the three voices in a music signal

Select the three filtered signals by clicking their Name column in the Signal table. On the Analyzer tab, click Export and save the signals to a MAT-file called music.mat. In MATLAB, load the file to the Workspace. Plot the spectra of the three signals.

load music

pspectrum(low)
hold on
pspectrum(medium)
pspectrum(high)
hold off

Figure contains an axes object. The axes object with title Fres = 1.9536 Hz, xlabel Frequency (kHz), ylabel Power Spectrum (dB) contains 3 objects of type line.

% To hear the different voices, type 
% sound(low.low,fs), pause(5), sound(medium.medium,fs), pause(5), sound(high.high,fs)

See Also

Apps

Functions

Related Examples

More About