Audio Filtering of the Trayvon Martin Shooting 911 Call

by Marlow Rumreich


Background

On February 26, 2012, neighborhood watch coordinator, George Zimmerman, shot Florida teen Trayvon Martin. There are many conflicting accounts about the circumstances that led up to the shooting, including possible injuries of Zimmerman by Martin. Key evidence in this case was an audio recording of a 911 call made by a neighbor that captured screams and gunshots from the incident. Because of the relatively poor quality of the recording and the ambiguity of the screams, there was intense debate during trial as to which party (Zimmerman or Martin) was the source of the screams. Both the defendant and the persecution had experts attempt to improve the quality of the audio in the call in order to demonstrate that their client was the source of the screams. Transcripts of this call and others can be found at [1].

The goal of this exercise is to improve the quality of the screams in the background of the call in order to obtain a better-informed view of the events that transpired right before Martin was shot. The quality of the audio will be improved through simple noise filtering in MATLAB, as shown in the following sections.


Audio Processing

The original audio clip was taken from [2] and reduced to a smaller section of audio, which can be played here: Media:OriginalCall_Cropped.wav

This audio can be loaded into MATLAB and graphed in the time domain.

Original911Call.png

This audio can be separated to isolate some of the screams occurring in the background of the call. In total, six screams were isolated from the discussion between the caller and the 911 operator. These screams comprise our "signal" because we would like to improve their sound quality. A segment, 'speech1', was also chosen to represent the "noise", which was made up of the true noise on the call and the voices of the female 911 operator and the female caller. The final segment, 'speech2' was the full cropped segment of the call used for comparison between the original and the filtered output. The MATLAB code below shows the audio being loaded into the program and separated into these sections.

MATLAB code:

[Call, Fs] = audioread('Original911Call.wav');
inc = length(Call)/20;
 
scream1 = Call(ceil(.63*inc):ceil(.79*inc));
scream2 = Call(ceil(3.1*inc):ceil(3.17*inc));
scream3 = Call(ceil(3.8*inc):ceil(3.9*inc));
scream4 = Call(ceil(4.54*inc):ceil(4.65*inc));
scream5 = Call(ceil(5.38*inc):ceil(5.52*inc));
scream6 = Call(ceil(6*inc):ceil(6.075*inc));
 
speech1 = Call(ceil(2.5*inc):ceil(3.5*inc));
speech2 = Call(ceil(2.5*inc):ceil(6.7*inc));

The unmodified waveform of 'scream4' can be seen below. This segment is less than 1 second long. It can be heard here: Media:scream4.wav

OriginalScream4.png


Frequency Analysis

A spectrogram was used to determine the frequency ranges of both the signal and the noise so an appropriate filter could be applied. Spectrograms for each section were created with the MATLAB code below. The spectrogram function built into MATLAB provided a better image of the frequency spectrum for these signals than the one created in Lab 9a [3], so that is what I used. The wideband and narrowband spectrograms were both used. However, the wideband spectrogram provided the clearest picture of the signal, so it is used below.

MATLAB code:

spectrogram(scream4, 40, 20, 512, Fs, 'yaxis');

The wideband spectrogram for 'scream4' is shown below. Note that the frequencies of this signal are primarily from 0-2500 Hz.

Scream4Spectrogram.png

The wideband spectrogram for 'speech1' can be seen below. The frequencies for this segment are primarily in the 0-5000 Hz range, but are also strong at frequencies up to 20,000 Hz.

Speech1Spectrogram.png


Filtering of the Signal

Because the signal frequencies were in the 0-2500 Hz range and the noise frequencies continued much higher than that limit, a low-pass filter was chosen to improve the signal quality. After initial trials with a cutoff frequency of 2500 Hz, it was decided that a value of 2200 Hz yielded a clearer result. This filter was implemented using MATLAB's butterworth filter command.

MATLAB code:

order = 10;  
Fc = 2200;  
[b,a] = butter(order, Fc/(Fs/2), 'low');
Filtered_speech = filter(b, a, speech1);

As designed, the filter did not have a significant effect of the waveform of the scream waveforms, but did impact the speech sample waveforms. For comparison, the original and filtered samples of 'scream4' and 'speech1' are shown.

OriginalScream4.png FilteredScream4.png

OriginalSpeech1.png FilteredSpeech1.png


However, the difference is much more easily heard than seen. When this filter is applied to the complete audio signal ('speech2'), the yelling in the background is clearer, and there are new parts that can be heard:

Media:OriginalCall_Cropped.wav

Media:FilteredCall.wav


Conclusions

Although it is not possible to provide a definitive answer about whether the screams came from Martin or Zimmerman, this improved signal may be able to help listeners better come to their own conclusions. I have included links to samples of both Trayvon Martin's and George Zimmerman's voices for comparison. If a more definitive answer is desired, future work could be done to refine the filter used and examine the formant frequencies of each voice to determine the best match.

Zimmerman Voice (911 call): https://www.youtube.com/watch?v=L04Vh4do6bY

Trayvon voice: https://www.youtube.com/watch?v=jylS4MXCqXY

Sources

[1] Background on origin of calls: http://www.washingtonpost.com/wp-srv/special/nation/last-minutes-trayvon-martin-911-calls/

[2] Source for original audio: https://www.youtube.com/watch?v=AYxJieDtLo0

[3] ECE 438 Lab 9a: https://engineering.purdue.edu/VISE/ee438L/lab9/pdf/lab9a.pdf

Alumni Liaison

Questions/answers with a recent ECE grad

Ryne Rayburn