diff --git a/PCP.ipynb b/PCP.ipynb
index b815ffb..7035997 100644
--- a/PCP.ipynb
+++ b/PCP.ipynb
@@ -164,7 +164,7 @@
"
\n",
+ "
Overview and Learning Objectives
\n",
+ "\n",
+ " \n",
+ "The
Fourier transform is one of the most important tools for a wide range of engineering and computer science applications. The general idea of
Fourier analysis is to decompose a given signal into a weighted superposition of sinusoidal functions. Since these functions possess an explicit physical meaning regarding their frequencies, the decomposition is typically more accessible for subsequent processing steps than the original signal. Assuming that you are familiar with the Fourier transform and its applications in signal processing, we review in this unit the discrete variant of the Fourier transform known as
Discrete Fourier Transform (DFT). We define the inner product that allows for comparing two vectors (e.g., discrete-time signals of finite length). The DFT can be thought of as comparing a given signal of finite length with a specific set of exponential signals (a complex variant of sinusoidal signals), each comparison yielding a complex-valued Fourier coefficient. Then, using suitable visualizations, we show how you can interpret the amplitudes and phases of these coefficients. Recall that one can express the DFT as a complex-valued square matrix. We show how separately plotting the real and imaginary parts leads to beautiful and insightful images. Applying a DFT boils down to computing matrix–vector product, which we implement via the standard NumPy function
np.dot
. Since the number of operations for computing a DFT via a simple matrix–vector product is quadratic in the input length, the runtime of this approach becomes problematic with increasing length. This issue is exactly where the fast Fourier transform (FFT) comes into the game. We present this famous divide-and-conquer algorithm and provide a Python implementation. Furthermore, we compare the runtime behavior between the FFT implementation and the naive DFT implementation. We will further deepen your understanding of the Fourier transform by considering further examples and visualization in the exercises. In
Exercise 1, you will learn how to interpret and plot frequency indices in a physically meaningful way. In
Exercise 2, we discuss the issue of loosing time information when applying the Fourier transform, which is the main motivation for the
short-time Fourier transform. In
Exercise 3, you will apply the DFT to a
chirp signal, which yields another illustrative example of the DFT's properties. Finally, in
Exercise 4, we will invite you to explore the relationship between the DFT and its inverse. Again, an overarching of this unit is to apply and deepen your Python programming skills within the context of a central topic for signal processing. \n",
+ " \n",
+ "
"
]
},
{
@@ -37,13 +49,19 @@
"\n",
+ "
Overview and Learning Objectives
\n",
+ "\n",
+ "This final unit of the PCP notebooks serves several purposes. First, we give a general introduction to
Python modules and
Python packages, which are fundamental concepts for organizing and making Python code available. Second, we introduce the Python package
libpcp
(that accompany the PCP notebooks) and use this package as a concrete example for illustrating the Python concepts. At the same time, this unit (together with
Unit 1) also documents the technical backbone underlying the PCP notebooks. Last but not least, we will also uncover in this unit the secret of where one can find the sample solutions for all exercises. In summary, we hope that the PCP notebooks help students naturally transition from learning about Python programming and signal processing to beginning independent research following good scientific practices. Another main motivation of the notebooks is to indirectly guide students to employ open-source tools for software development and reproducible research. \n",
+ "\n",
+ "
"
+ ]
+ },
{
"cell_type": "markdown",
"metadata": {},
diff --git a/PCP_signal.ipynb b/PCP_signal.ipynb
index b947009..05013b9 100644
--- a/PCP_signal.ipynb
+++ b/PCP_signal.ipynb
@@ -35,15 +35,7 @@
"\n",
"
Overview and Learning Objectives
\n",
"\n",
- "In technical fields such as engineering or computer science, a
signal is a function that conveys information about the state or behavior of a physical system. For example, a signal may describe the time-varying sound pressure at some place, the motion of a particle through some space, the distribution of light on a screen representing an image, or the sequence of images as in the case of a video signal. In this unit, we consider the case of sound or audio signals, which may be represented graphically by a plot that shows the relative air pressure (with respect to a reference air pressure) over time. In some way, a sinusoid of given frequency may be thought of a prototype of such a signal. We start this unit by formally defining such a signal as a mathematical function. Interleaving theory with practice, we then define a Python function to generate a sinusoid as a first example, which you can look at by means of a plot and listen to via some audio playback. To digitally compute with signals, one typically needs to convert a continuous into a discrete time axis—a process referred to as
sampling. While providing a Python function that performance some equidistant sampling, we also discuss the kind of information that may be lost in the sampling process. This leads us to topics related to
aliasing and the
sampling theorem. Finally, using sinusoidal signals as example, we cover the phenomena of
interference. In the exercises, we take up and further deepen these aspects by studying the phenomenon known as
beating and looking at further examples illustrating aliasing. We assume that you are mostly familiar with these fundamental concepts that typically taught in an introductory signal processing course. Besides a review of these concepts, another main learning objective of this unit is to illustrate how to generate and use multimedia objects (e.g., audio, image, and video objects) within a Jupyter session. \n",
- "\n",
- "This notebook is based on material from the
FMP Notebook on Sampling and the
FMP Notebook on Interference and Beating.\n",
- "\n",
- " \n",
- "
Fourier transform\n",
- "
Unit 8 \n",
- "\n",
- "These examples also\n",
+ "In technical fields such as engineering or computer science, a
signal may be defined as a function that conveys information about the state or behavior of a physical system. For example, a signal may describe the time-varying sound pressure at some place, the motion of a particle through some space, the distribution of light on a screen representing an image, or the sequence of images as in the case of a video signal. In this unit, we consider the case of sound or audio signals, which may be represented graphically by a plot that shows the relative air pressure (with respect to a reference air pressure) over time. In some way, a sinusoid of a given frequency may be thought of as a prototype of an audio signal. We start this unit by formally defining a signal as a mathematical function. Interleaving theory with practice, we then provide a Python function to generate a sinusoid with different parameters (duration, amplitude, frequency, phase, sampling rate), which you can look at via a plot and listen to via audio playback. To digitally compute with signals, one typically needs to convert a signal given on a continuous-time axis into one given on a discrete-time axis—a process commonly referred to as
sampling. While providing a Python function that performs some equidistant sampling, we also discuss the kind of information that may be lost in the sampling process. This leads us to topics related to
aliasing and the
sampling theorem. Finally, using sinusoidal signals as an example, we cover the phenomena of constructive and destructive
interference. In the exercises, we further deepen these aspects by studying the phenomenon known as
beating and by looking at further examples illustrating aliasing. We assume that you are familiar with these fundamental concepts that are typically taught in an introductory signal processing course. Besides reviewing these concepts, another main learning objective of this unit is to show you how to generate and use multimedia objects (e.g., audio, image, and video objects) within the Jupyter notebook framework. In particular, in fields such as multimedia engineering, the interaction with concrete multimedia objects (e.g., sound examples) will help you move from recalling and reciting theoretical concepts towards comprehension and application. Following similar educational considerations, you may find additional material in the
FMP Notebooks for teaching and learning fundamentals of music processing. In particular, the
FMP Notebook on Sampling and the
FMP Notebook on Interference and Beating have served as basis for this unit. \n",
" \n",
"
"
]
@@ -55,7 +47,7 @@
"