Skip to main content

MATLAB: Sinusoids with Gaussian, Uniform, Laplace, Binary, and Pink Noise

 

MATAB Code

%% ==========================================================

%  WSS / Noise Demonstration Simulator

%  Sinusoid + Multiple Noise Types

%  Distribution + Autocorrelation + PSD

%  LTI System Demonstration

%% ==========================================================


clear;

close all;

clc;


%% Parameters

Fs = 1000;              % Sampling Frequency

N  = 5000;              % Number of Samples

t  = (0:N-1)/Fs;


A  = 1;                 % Sinusoid Amplitude

f0 = 20;                % Sinusoid Frequency


signal = A*sin(2*pi*f0*t);


noiseVariance = 0.25;

noiseStd = sqrt(noiseVariance);


%% ==========================================================

% Generate Noise Types

%% ==========================================================


% Gaussian Noise

gaussianNoise = noiseStd*randn(1,N);


% Uniform Noise (same variance)

uniformNoise = (rand(1,N)-0.5)*sqrt(12*noiseVariance);


% Laplace Noise

u = rand(1,N)-0.5;

b = sqrt(noiseVariance/2);

laplaceNoise = -b*sign(u).*log(1-2*abs(u));


% Binary Noise

binaryNoise = noiseStd*sign(rand(1,N)-0.5);


% Pink Noise (simple approximation)

whiteNoise = randn(1,N);

pinkNoise = filter(1,[1 -0.98],whiteNoise);

pinkNoise = pinkNoise/std(pinkNoise)*noiseStd;


%% ==========================================================

% Create Noisy Signals

%% ==========================================================


sigGaussian = signal + gaussianNoise;

sigUniform  = signal + uniformNoise;

sigLaplace  = signal + laplaceNoise;

sigBinary   = signal + binaryNoise;

sigPink     = signal + pinkNoise;


%% ==========================================================

% Figure 1 : Time Domain Signals

%% ==========================================================


figure('Name','Sinusoid with Different Noise Types',...

       'Position',[100 100 1200 800]);


subplot(3,2,1)

plot(t(1:1000),signal(1:1000),'k','LineWidth',1.5)

title('Pure Sinusoid')

xlabel('Time (s)')

ylabel('Amplitude')

grid on


subplot(3,2,2)

plot(t(1:1000),sigGaussian(1:1000))

title('Sinusoid + Gaussian Noise')

grid on


subplot(3,2,3)

plot(t(1:1000),sigUniform(1:1000))

title('Sinusoid + Uniform Noise')

grid on


subplot(3,2,4)

plot(t(1:1000),sigLaplace(1:1000))

title('Sinusoid + Laplace Noise')

grid on


subplot(3,2,5)

plot(t(1:1000),sigBinary(1:1000))

title('Sinusoid + Binary Noise')

grid on


subplot(3,2,6)

plot(t(1:1000),sigPink(1:1000))

title('Sinusoid + Pink Noise')

grid on


%% ==========================================================

% Figure 2 : Noise Histograms

%% ==========================================================


figure('Name','Noise Distributions',...

       'Position',[150 100 1200 800]);


subplot(3,2,1)

histogram(gaussianNoise,50,'Normalization','pdf')

title('Gaussian Distribution')

grid on


subplot(3,2,2)

histogram(uniformNoise,50,'Normalization','pdf')

title('Uniform Distribution')

grid on


subplot(3,2,3)

histogram(laplaceNoise,50,'Normalization','pdf')

title('Laplace Distribution')

grid on


subplot(3,2,4)

histogram(binaryNoise,50,'Normalization','pdf')

title('Binary Distribution')

grid on


subplot(3,2,5)

histogram(pinkNoise,50,'Normalization','pdf')

title('Pink Noise Distribution')

grid on


%% ==========================================================

% Figure 3 : Distribution Comparison

%% ==========================================================


figure('Name','Distribution Comparison');


hold on


[f,x] = ksdensity(gaussianNoise);

plot(x,f,'LineWidth',2)


[f,x] = ksdensity(uniformNoise);

plot(x,f,'LineWidth',2)


[f,x] = ksdensity(laplaceNoise);

plot(x,f,'LineWidth',2)


legend('Gaussian','Uniform','Laplace')

xlabel('Amplitude')

ylabel('Probability Density')

title('Noise Probability Density Functions')

grid on


%% ==========================================================

% Figure 4 : Autocorrelation

%% ==========================================================


figure('Name','Noise Autocorrelation',...

       'Position',[150 100 1200 800]);


subplot(3,2,1)

autocorr(gaussianNoise,100)

title('Gaussian')


subplot(3,2,2)

autocorr(uniformNoise,100)

title('Uniform')


subplot(3,2,3)

autocorr(laplaceNoise,100)

title('Laplace')


subplot(3,2,4)

autocorr(binaryNoise,100)

title('Binary')


subplot(3,2,5)

autocorr(pinkNoise,100)

title('Pink')


%% ==========================================================

% Figure 5 : Power Spectral Density

%% ==========================================================


figure('Name','Power Spectral Density',...

       'Position',[150 100 1200 800]);


subplot(3,2,1)

pwelch(gaussianNoise)

title('Gaussian PSD')


subplot(3,2,2)

pwelch(uniformNoise)

title('Uniform PSD')


subplot(3,2,3)

pwelch(laplaceNoise)

title('Laplace PSD')


subplot(3,2,4)

pwelch(binaryNoise)

title('Binary PSD')


subplot(3,2,5)

pwelch(pinkNoise)

title('Pink PSD')


%% ==========================================================

% Figure 6 : WSS Through LTI System

%% ==========================================================


h = [0.2 0.5 0.2];


x = gaussianNoise;

y = conv(x,h,'same');


figure('Name','WSS Through LTI');


subplot(2,2,1)

plot(x(1:500))

title('Input WSS Process')

grid on


subplot(2,2,2)

plot(y(1:500))

title('Output Process')

grid on


subplot(2,2,3)

[Rx,lags] = xcorr(x,100,'biased');

plot(lags,Rx,'LineWidth',1.5)

title('Input Autocorrelation')

xlabel('Lag')

grid on


subplot(2,2,4)

[Ry,lags] = xcorr(y,100,'biased');

plot(lags,Ry,'LineWidth',1.5)

title('Output Autocorrelation')

xlabel('Lag')

grid on


%% ==========================================================

% Figure 7 : WSS vs Non-WSS

%% ==========================================================


xWSS = randn(1,N);


xNonWSS = (1 + 0.002*(1:N)).*randn(1,N);


window = 200;


runningMeanWSS = movmean(xWSS,window);

runningMeanNonWSS = movmean(xNonWSS,window);


figure('Name','WSS vs Non-WSS');


subplot(2,1,1)

plot(runningMeanWSS,'LineWidth',1.5)

title('Running Mean of WSS Process')

ylabel('Mean')

grid on


subplot(2,1,2)

plot(runningMeanNonWSS,'r','LineWidth',1.5)

title('Running Mean of Non-WSS Process')

ylabel('Mean')

xlabel('Sample Index')

grid on


%% ==========================================================

% Figure 8 : Correlation Matrix Visualization

%% ==========================================================


[R,lags] = xcorr(x,50,'biased');


Rpositive = R(lags>=0);


figure('Name','Correlation Matrix');


imagesc(toeplitz(Rpositive))

colormap(jet)

colorbar


title('Autocorrelation Matrix of WSS Process')

xlabel('Sample Index')

ylabel('Sample Index')


%% ==========================================================

% Summary

%% ==========================================================


disp('========================================');

disp('Simulation Complete');

disp('Generated:');

disp('1. Noisy sinusoid signals');

disp('2. Noise distributions');

disp('3. PDF comparison');

disp('4. Autocorrelation plots');

disp('5. Power spectral densities');

disp('6. WSS -> LTI -> WSS demonstration');

disp('7. WSS vs Non-WSS comparison');

disp('8. Correlation matrix visualization');

disp('========================================');


Output












Contact Us

Name

Email *

Message *