MATLAB实现白噪声与色噪声仿真

MATLAB实现白噪声与色噪声仿真,并绘制其自相关函数和功率谱密度函数


一、仿真代码实现

matlab 复制代码
%% 参数设置
clear; clc; close all;
fs = 1000;        % 采样频率(Hz)
t = 0:1/fs:1-1/fs;% 时间向量(1秒)
N = length(t);    % 信号长度

%% 1. 生成白噪声
white_noise = randn(1,N); % 高斯白噪声

%% 2. 生成色噪声(以带通滤波为例)
[b,a] = butter(4, [0.2 0.3]); % 4阶带通滤波器(200-300Hz)
colored_noise = filter(b,a,white_noise);

%% 3. 自相关函数计算
[r_white,lags] = xcorr(white_noise,'biased'); % 白噪声自相关
[r_color,lags] = xcorr(colored_noise,'biased'); % 色噪声自相关

%% 4. 功率谱密度计算
[Pxx,f] = periodogram(white_noise,[],N,fs); % 白噪声PSD
[Pyy,f] = periodogram(colored_noise,[],N,fs);% 色噪声PSD

%% 5. 绘图
figure;

% 白噪声分析
subplot(2,2,1);
plot(t,white_noise);
title('白噪声时域波形');
xlabel('时间(s)'); ylabel('幅值');

subplot(2,2,2);
stem(lags/fs,r_white*fs/N);
title('白噪声自相关函数');
xlabel('归一化时延'); ylabel('幅度');
xlim([-0.1 0.1]);

subplot(2,2,3);
plot(f,10*log10(Pxx));
title('白噪声功率谱密度');
xlabel('频率(Hz)'); ylabel('dB/Hz');
xlim([0 500]);

% 色噪声分析
subplot(2,2,4);
plot(t,colored_noise);
title('色噪声时域波形');
xlabel('时间(s)'); ylabel('幅值');

figure;

subplot(2,1,1);
stem(lags/fs,r_color*fs/N);
title('色噪声自相关函数');
xlabel('归一化时延'); ylabel('幅度');
xlim([-0.1 0.1]);

subplot(2,1,2);
plot(f,10*log10(Pyy));
title('色噪声功率谱密度');
xlabel('频率(Hz)'); ylabel('dB/Hz');
xlim([0 500]);

二、关键特性分析

1. 时域特性
噪声类型 波形特征 统计特性
白噪声 短时强波动,无周期性 均值=0,方差恒定
色噪声 波动幅度相对平缓 均值=0,方差可能时变
2. 自相关函数
matlab 复制代码
% 自相关函数特性对比
figure;
subplot(2,1,1);
plot(lags/fs,r_white*fs/N);
title('白噪声自相关函数');
xlabel('时延(s)'); ylabel('归一化幅度');
xlim([-0.001 0.001]);

subplot(2,1,2);
plot(lags/fs,r_color*fs/N);
title('色噪声自相关函数');
xlabel('时延(s)'); ylabel('归一化幅度');
xlim([-0.001 0.001]);
  • 白噪声:自相关函数在零时延处为峰值,两侧快速衰减至零(δ函数特性)
  • 色噪声:自相关函数存在非零拖尾,表明时域相关性
3. 功率谱密度
matlab 复制代码
% 功率谱密度对比
figure;
subplot(2,1,1);
plot(f,10*log10(Pxx));
title('白噪声功率谱密度');
xlabel('频率(Hz)'); ylabel('dB/Hz');
xlim([0 500]);

subplot(2,1,2);
plot(f,10*log10(Pyy));
title('色噪声功率谱密度');
xlabel('频率(Hz)'); ylabel('dB/Hz');
xlim([0 500]);
  • 白噪声:全频段功率谱密度平坦(约-3dB/Hz)
  • 色噪声:在滤波器通带(200-300Hz)呈现明显能量集中

三、典型应用场景

  1. 白噪声仿真

    matlab 复制代码
    % 高斯白噪声
    gn = 0.5*randn(1,fs); 
    % 均匀白噪声
    un = 0.5*(rand(1,fs)-0.5);
  2. 色噪声生成方法

    • 低通色噪声:通过低通滤波器

      matlab 复制代码
      [b,a] = butter(4,0.2);
      colored = filter(b,a,randn(1,N));
    • 粉红噪声:使用Voss-McCartney算法

      matlab 复制代码
      function pink = pink_noise(N)
          white = randn(N,1);
          b = [0.049922035, -0.09599352, 0.050612699, -0.004408786];
          a = [1, -2.494956002, 2.017265875, -0.522189400];
          pink = filter(b,a,white);
      end

四、扩展实验建议

  1. 多通道噪声分析

    matlab 复制代码
    % 生成多通道有色噪声
    [b1,a1] = butter(4,0.2);
    [b2,a2] = butter(6,0.3);
    noise1 = filter(b1,a1,randn(1,N));
    noise2 = filter(b2,a2,randn(1,N));
  2. 实时噪声仿真

    matlab 复制代码
    % 使用音频设备实时采集
    audioDeviceReader('SampleRate',fs);
  3. 噪声抑制对比

    matlab 复制代码
    % 维纳滤波去噪
    [dpsd,f] = pwelch(noise,hamming(256));
    H = 1./dpsd; % 理想维纳滤波器
    denoised = filter(H,1,noise);

参考代码 白噪声与色噪声的仿真样例 www.youwenfan.com/contentcsl/79805.html

五、注意事项

  1. 频率轴校准

    matlab 复制代码
    f = (0:N/2)*fs/N; % 正确计算频率轴
  2. 功率谱单位转换

    matlab 复制代码
    % 从V²/Hz转换为dB/Hz
    PSD_dB = 10*log10(PSD);
  3. 随机种子控制

    matlab 复制代码
    rng(0); % 固定随机种子保证可重复性

该方法通过对比白噪声与色噪声的时域波形、自相关函数和功率谱密度,清晰展示了二者的本质区别。实际应用中可根据具体需求选择噪声类型,并通过滤波器设计实现噪声特性控制。

相关推荐
似水এ᭄往昔2 小时前
【C++】--模板进阶
开发语言·c++
yue0083 小时前
C# 求取整数的阶乘
java·开发语言·c#
曹绍华3 小时前
android 线程loop
android·java·开发语言
树在风中摇曳3 小时前
C语言动态内存管理:从基础到进阶的完整解析
c语言·开发语言·算法
mjhcsp3 小时前
C++ 高精度计算:突破数据类型限制的实现与应用
开发语言·c++·算法·高精度
lixinnnn.4 小时前
C++: map和set
开发语言·c++
郝学胜-神的一滴4 小时前
Qt QPushButton 样式完全指南:从基础到高级实现
linux·开发语言·c++·qt·程序人生
沐知全栈开发4 小时前
R MySQL 连接
开发语言
tryxr4 小时前
变量捕获相关内容
java·开发语言·jvm