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); % 固定随机种子保证可重复性

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

相关推荐
leo_23232 分钟前
从开发语言角度来谈谈SMP(上)--SMP(软件制作平台)语言基础知识之十三
开发语言·开发工具·smp(软件制作平台)·应用系统
Larry_Yanan8 小时前
Qt多进程(三)QLocalSocket
开发语言·c++·qt·ui
醒过来摸鱼9 小时前
Java classloader
java·开发语言·python
superman超哥9 小时前
仓颉语言中元组的使用:深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
小鸡吃米…9 小时前
Python - 继承
开发语言·python
JIngJaneIL9 小时前
基于java+ vue农产投入线上管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot
祁思妙想9 小时前
Python中的FastAPI框架的设计特点和性能优势
开发语言·python·fastapi
唐装鼠9 小时前
rust自动调用Deref(deepseek)
开发语言·算法·rust
Lucas555555559 小时前
现代C++四十不惑:AI时代系统软件的基石与新征程
开发语言·c++·人工智能
源代码•宸9 小时前
goframe框架签到系统项目(BITFIELD 命令详解、Redis Key 设计、goframe 框架教程、安装MySQL)
开发语言·数据库·经验分享·redis·后端·mysql·golang