A Channel Vocoder in Matlab

What is a channel vocoder?

The channel vocoder operates as a bank of filters that breaks two incoming sound sources (the carrier and the modulator) into compatible frequency regions. The envelope within each subband of the modulator is imposed on the appropriate subband of the carrier, and the resulting sounds are added together. As shown below, the rectification nonlinearity followed by a lowpass filter approximates the envelope of the sound within the band. The channel vocoder can be used to generate a classic robotic-voice when modulated with speech, and it has found extensive use as a special effect in Hollywood.

The channel vocoder can be interpreted as a filter-bank that imposes the envelope of one sound (the modulator) onto the waveform of another (the carrier). The envelope operation (represented here by the application of a rectification nonlinearity g(x) followed by a lowpass filter) is applied separately within each frequency band.

Modern implementations of the channel vocoder typically replace the filter banks with FFTs. This is quicker computationally when many bands are used, and both the nonlinearity and lowpass filtering can be easily accomplished using the magnitude of the FFT. Byung Park has programmed this as part of his Master's project, and the (Matlab) code appears here. The "help" file for chanvocoder.m reads:

function y = chanvocoder(carrier, modul, chan, numband, overlap)
% y = chanvocoder(carrier, modul, chan, numband, overlap)
% The Channel Vocoder modulates the carrier signal with the modulation signal
% chan = number of channels (e.g., 512)
% numband = number of bands (<chan) (e.g., 32)
% overlap = window overlap (e.g., 1/4)
% written by Park and Sethares 2005.

As you can see, chanvocoder requires two signals. The modulator is typically a voice (speak clearly and slowly) and the carrier is typically a harmonically rich sound source (such as an organ, synthesizer, or colored noise). These must both have the same number of tracks, i.e., they must either both be mono or both be stereo. You can choose the number of channels (the FFTs are of length 2*chan) and the number of bands (how many frequency bands to break the signal into), as well as the amount of overlap between successive FFT frames. The sound will change depending on these values. Typically, you will use chanvocoder.m with sound files in the .wav format. For example, suppose there is a .wav file called "carrier22.wav" and another called "modulator22.wav." A typical way to call the vocoder is:

modfile = 'modulator22';
carfile = 'carrier22';
outfile = 'vocodedsound.wav'
[modul, sr1] = wavread(modfile);
[carrier, sr2] = wavread(carfile);
if sr1~=sr2, disp('your sampling rates dont match'); end
y = chanvocoder(carrier, modul, 512, 16, .2);
wavwrite(y,sr1,16,outfile)

This reads in the two sound files using the wavread command, checks that the sampling rates match (if not, you won't get what you expect), calls the chanvocoder function, and then writes the output as another sound file that you can listen to in Matlab, or using any audio program capable of playing .wav files. So that you can check to see that everything is working, here are the above carrier and modulator files, along with the output you should hear from the above script. (You may need to right click to download these files.) After downloading, make sure that they (along with the chanvocoder.m function itself) are placed in the Matlab path. You should be able to run the program and get the same output as "vocodedsound.wav." By using different carrier and modulator sounds, there are a variety of effects that you can create. You may also be interested to compare this implementation with the C language Zerius Vocoder -- you will find that they operate similarly, and indeed, the test files above (carrier22 and modulator22) are taken from the Zerius website.

To get to my homepage, click here.