CEN/EEN330 Course Project
Title: Signal Mixing and Source Separation
Tools: MATLAB
Due Date: 4 June 2025
Project Overview
This project introduces students to the concepts of random signal mixing and source separation through a simplified version of the Cocktail Party Problem. Using MATLAB, you will explore how signals can be mixed using a known matrix, and how they can be recovered using two statistical methods: Principal Component Analysis (PCA) and Independent Component Analysis (ICA).
The project focuses on key probabilistic concepts such as Gaussianity, the Central Limit Theorem (CLT), statistical independence vs. correlation, and the effect of additive white Gaussian noise on signal recovery.
Learning Objectives
By completing this project, you will:
- Apply MATLAB to analyze and process noisy signal data.
- Simulate random signal mixing and investigate the role of mixing matrices.
- Understand the impact of Gaussian noise on signal quality and recovery.
- Compare PCA and ICA in terms of their probabilistic assumptions and performance.
- Use histogram analysis, kurtosis, and correlation to interpret results.
Task Breakdown
1. Setup and Signal Mixing
- You will be provided with source signals (.wav files), chose one voice and one music, or get your own from any source (keep them short ~few seconds).
- Load the signals and make sure they are of the same sampling rate.
- Normalize the signals in the range [-1,1] and do the same for each signal at each step to avoide clipping.
- Use a predefined 2×2 mixing matrix to linearly mix the signals.
- Add Gaussian noise to the mixed signals (one level, e.g., PSNR = 20 dB).
2. Signal Recovery
- Apply PCA using MATLAB’s built-in functions.
- Apply ICA using MATLAB’s fastica() function.
· Save all signals (original, mixed, ICA, PCA) as .wav files.
3. Analysis and Comparison
- Plot waveforms of original, mixed, and separated signals.
- Plot histograms of the recovered signals.
- Calculate Correlation coefficients between original and recovered signals
- Calculate Kurtosis values of the recovered signals
- Use results to explain why ICA can recover original signals, while PCA may fail.
Expected Report Structure
Section 1: Introduction
- Brief explanation of the Cocktail Party Problem
- Purpose of the project in the context of randomness and noise
Section 2: Methodology
- Description of the mixing process and noise addition
- Overview of PCA and ICA techniques
- Tools and MATLAB functions used
Section 3: Results
- Plots of mixed and separated signals
- Histograms and statistical measures (correlation, kurtosis)
· Observations on saved .wav files
Section 4: Discussion
- Why ICA works under the CLT and non-Gaussian assumptions
- Why PCA fails to separate independent sources
- How Gaussian noise affects the recovery process
Section 5: Conclusion
- Summary of findings
- Relevance to course topics in EEN330
Provided Materials
- Source signals in .wav format
- MATLAB starter code for signal loading, mixing, recovery and plotting
- Template for fastica() and PCA implementation
Submission Requirements
- Report.
- MATLAB code (.m files).
- All signals in (.wav files)
MATLAB Starter Code Snippets
Loading a Source Signal
[s1, fs1] = audioread(voice.wav’);
Adjust Length of a signal
minLen = min(length(x1), length(x2));
x1 = x1(1:minLen);
Convert a signal to a row vector
x1 = x1(:)’;
Normalize a signal to [-1,1]:
x1 = x1 / max(abs(x1));
Combine the voice and music signals
S = [x1; x2];
S = S – mean(S, 2);
S = S ./ std(S, 0, 2);
Mixing and Noise Addition
A = [1 0.5; 0.4 1];
X = A * S;
Add Gaussian Noise
noise_power = 0.01 * var(X, 0, 2); % Adjust scale as needed
noise = sqrt(noise_power) .* randn(size(X));
X_noisy = X + noise;
Apply ICA
r = 2;
[Zica, ~, ~, ~] = fastICA(X_noisy, r);
Apply PCA
[coeff, score, ~] = pca(X_noisy’);
pca_sig = score(:,1:2)’;
Results Examples
figure;
time = (0:minLen-1) / fs1;
subplot(4,2,5); plot(time, Zica(1,:)); title(‘Recovered Signal 1 (ICA)’);
audiowrite(fullfile(audio_path,’ica_recovered1.wav’), Zica(1,:)’, fs1);
fprintf(‘ICA1 vs Original Voice: %.3fn’, corr(Zica(1,:)’, S(1,:)’));
fprintf(‘PCA Signal 1: %.3fn’, kurtosis(pca_result(1,:)));
figure;
subplot(4,2,1); histogram(S(1,:), 100); title(‘Histogram: Original Signal 1’);