Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Signal processing using Scipy\n",
"\n",
"In this notebook we will explore how the [scipy](https://scipy.org/scipylib/) package can be used to perform signal processing.\n",
"\n",
"Scipy stands for *sci*entific *py*thon, and is a package with a vast range of modules for a range of scientific computing problems. From linear algebra to optimization; from integration to interpolation: it is the go-to Python package for traditional scientific computing problems. Scipy is built from numpy's `ndarray`, and scipy interfaces with `matlotlib` for visuals. So when working with scipy it is essential we also have numpy and matplotlib imported too."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Scipy is a large package with many submodules. It is standard to just import the modules we will be working with on a givgen task. In this notebook, we'll be using the modules `fftpack` and `signal`, which give access to methods related to the Fast Fourier Transform, and signal processing, respectively. We will also need some helper functions for reading in signals, from the `scipy.io` module."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"from scipy import fftpack\n",
"from scipy import signal\n",
"from scipy.io import wavfile"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Working with signals\n",
"A signal is a series of measurements over time, related to some phenmomenon. It could be the light emitted from a chemical reaction, sound transmitted through the air, or the heat of an organism throughout some biological process. When we work with signals in python, we are considering digital signals: samples of a signal taken at discrete time-steps. Today we will be working with a familiar signal: we'll be working with audio signals (i.e. those coming from sound waves). \n",
"\n",
"### Reading in a wav aoudio file.\n",
"Let's see how we can represent an audio signal in python. We are going to use the `wavfile.read` helper to read in a recording of a guitar chord (you can listen to it by clicking on the file in the Jupyter folder)."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.6/site-packages/scipy/io/wavfile.py:273: WavFileWarning: Chunk (non-data) not understood, skipping it.\n",
" WavFileWarning)\n"
]
}
],
"source": [
"chord = wavfile.read(\"data/chord-11.wav\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This function returns a tuple. The first element is the sample rate, and the second is the actual data from the file."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(44100, array([[ -8, 45],\n",
" [ 30, 91],\n",
" [ 82, 129],\n",
" ...,\n",
" [ 0, 0],\n",
" [ 0, 0],\n",
" [ 0, 0]], dtype=int16))"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chord"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plotting the data from the wav with `plt` will give the charactersitic plot of the sound wave that we're used to."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fc1db38bda0>,\n",
" <matplotlib.lines.Line2D at 0x7fc1db397a58>]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(chord[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To check we're doing thing correctly, let's write that data back to another file. By opening the original file and the file we've written, you should convinve yourself that the numpy array created by `wavfile.read` really does represent the audio signal of the wav file."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"wavfile.write(\"data/test.wav\", chord[0], chord[1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Applying the FFT\n",
"The Fourier transfrom is a way of breaking down a signal into its component parts. With audio signals, it tells us how we could have built up our original signal by combining certain elementary (sin and cosine) sound waves. It's a bit like \"unmixing\" coloured paint to find out how much red, blue and yellow went into a given colour. The process is quite complicated, so for the purposes of this notebook we will just understand it at this high level: given a signal, the Fourier transform gives us its decomposition into elementary waves, which is like a kind of fingerprint unique to that signal. The Fast Fourier Transform (FFT) is a particularly efficient algorithm for calculating the Fourier transform of a signal."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/opt/conda/lib/python3.6/site-packages/numpy/core/numeric.py:492: ComplexWarning: Casting complex values to real discards the imaginary part\n",
" return array(a, dtype, copy=False, order=order)\n"
]
},
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x7fc1db2e8a20>,\n",
" <matplotlib.lines.Line2D at 0x7fc1db2e8b70>]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"chord_transform = fftpack.fft(chord[1])\n",
"plt.plot(chord_transform)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 37.+0.j, -53.+0.j],\n",
" [121.+0.j, -61.+0.j],\n",
" [211.+0.j, -47.+0.j],\n",
" ...,\n",
" [ 0.+0.j, 0.+0.j],\n",
" [ 0.+0.j, 0.+0.j],\n",
" [ 0.+0.j, 0.+0.j]])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chord_transform"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 2
}