MATLAB实验——干扰与抗干扰

9

实验目的与意义

  1. 了解干扰的定义以及干扰的类型。
  2. 学习实单音干扰、复单音干扰、抗单音干扰、多音干扰、白噪声窄带干扰和扫频干扰的原理。
  3. 掌握在matlab对音频信号添加多音干扰和扫频干扰的方法。
  4. 熟悉reshape函数、cumsum函数、mesh函数,掌握在matlab中绘出三维曲面图的方法。

实验过程

  1. 使用audioread函数导入音频信号exp.wav,定义音频信号wave和采样率fs。 [wave, fs] = audioread("exp.wav");
  2. 添加多音干扰。设置FFT点数为8192,采样32组。使用for循环随机生成三种干扰信号,其中InitPhase为初相位,使用rand函数生成;Fj为噪声频率,使用randi函数生成。添加多音干扰后分布生成原音频、三种噪声以及添加噪声后的音频的频谱图。 N = 8192;%FFT点数
    M = 32;
    SampLen = MN; wave = wave(1:SampLen,1).'; L = length(wave); time = L/fs; for jamming_index = 1:3 InitPhase = rand; Fj = (randi(N/2)-1)fs/N;
    jamming(jamming_index,:) = cos(2pi(Fj/fs*[0:SampLen-1]+InitPhase));
    end
    jamming = sum(jamming);
    wave_jammed = wave+jamming;
    sound(wave_jammed,fs);
    %画出频谱图
    figure('Name','添加多音干扰 频谱图');
    subplot(311);
    plot([-L/2:L/2- 1]/time,abs(fftshift(fft(transpose(wave)))),'linewidth',1.5);
    title('原音频'); xlabel('频率/Hz'); grid on;
    subplot(312);
    plot([-L/2:L/2- 1]/time,abs(fftshift(fft(transpose(jamming)))),'linewidth',1.5);
    title('三种频率的噪声'); xlabel('频率/Hz'); grid on;
    subplot(313);
    plot([-L/2:L/2- 1]/time,abs(fftshift(fft(transpose(wave_jammed)))),'linewidth',1.5);
    title('添加噪声后的音频'); xlabel('频率/Hz'); grid on;
  1. 进行分组合并检测干扰。使用reshape函数将加噪后的音频矩阵重构为8192×32的矩阵,使用fft函数对重构后的矩阵进行快速傅里叶变换,画出变换后矩阵的三维曲面图。 wave_groups = reshape(wave_jammed,N,M);
    wave_groups_fft = fft(wave_groups);
    figure('Name','分组合并检测干扰 三维曲面图');
    mesh(abs(wave_groups_fft));
    combined_spectrum = sum(abs(wave_groups_fft),2);
    jammed_index = find(combined_spectrum>2000*M);
  1. 删除上一步中找的的干扰信号。生成删除干扰后的三维曲面图。对删除干扰信号后的音频进行重构,使其能够正常播放。 wave_groups_fft(jammed_index,:) = 0;
    figure('Name','干扰删除 三维曲面图');
    mesh(abs(wave_groups_fft));
    wave_antijammed = reshape(ifft(wave_groups_fft),1,[]);
    sound(wave_antijammed,fs);
  1. 添加扫频干扰信号。生成时长为10s,周期为2s,从100Hz到10100Hz之间匀速变化的扫频干扰信号。生成时域图。 [wave,fs] = audioread("exp.wav");
    wave = transpose(wave);
    t_scale = 0:1/fs:(10-1/fs);
    f_t = 10000*abs(1-mod(t_scale,2))+100;
    figure('Name','扫频干扰 时域图');
    plot(t_scale,f_t,'linewidth',2);
    title('扫频干扰'); xlabel('时间/s'); grid on;