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

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

相关推荐
LawrenceLan5 小时前
Flutter 零基础入门(十一):空安全(Null Safety)基础
开发语言·flutter·dart
txinyu的博客5 小时前
解析业务层的key冲突问题
开发语言·c++·分布式
码不停蹄Zzz6 小时前
C语言第1章
c语言·开发语言
行者966 小时前
Flutter跨平台开发在OpenHarmony上的评分组件实现与优化
开发语言·flutter·harmonyos·鸿蒙
阿蒙Amon6 小时前
C#每日面试题-Array和ArrayList的区别
java·开发语言·c#
SmartRadio7 小时前
ESP32添加修改蓝牙名称和获取蓝牙连接状态的AT命令-完整UART BLE服务功能后的完整`main.c`代码
c语言·开发语言·c++·esp32·ble
且去填词7 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go
知乎的哥廷根数学学派7 小时前
基于生成对抗U-Net混合架构的隧道衬砌缺陷地质雷达数据智能反演与成像方法(以模拟信号为例,Pytorch)
开发语言·人工智能·pytorch·python·深度学习·机器学习
yeziyfx8 小时前
kotlin中 ?:的用法
android·开发语言·kotlin
charlie1145141918 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式