Matlab学习笔记(二)-电话信道仿真

利用Matlab仿真理想不失真与失真电话信道,并分别观察信道特性以及语音信号经过信道后的输出特性

  1. 无失真信道

理想恒参信道特性:信号传输无失真

  1. 幅频特性在全频率范围内是一条水平线

  1. 相频特性在全频率范围内是一条通过原点的直线,斜率为-td

  1. 群迟延特性在全频率范围内是一条水平线,幅值为td

从图中可以看出信道的幅频特性为常数2,相频特性为过原点且斜率为0.5的直线,群迟延特性也为常数且数值等于相频特性的斜率

对比原始信号与输出信号的时域图,发现几乎相同,但是在某些峰值处有所削减,播放的声音也与原音频一致。

对比原始信号与输出信号的频域图,其形状几乎一样,但是输出信号的幅值为原始信号的两倍,与信道的幅频特性相符合。

  1. 失真信道

所仿真的失真信道的幅频特性设为过原点的直线,相频特性为二次曲线,则群时延特性为其导数,即过原点的直线。

对比原始信号与输出信号的时域图,两者差别较为显著,输出音频效果几乎完全失真。

对比原始信号与输出信号的幅度谱,发现低频部分的幅值与高频部分的幅值相差巨大,以至于图中低频部分近乎消失,这是由信道幅频特性中高频和低频差异较大导致的。

  1. 思考总结

(1)通过模拟电话信道,对信号在系统中的传输原理更加清楚,原始信号在时域卷积等于在频域与系统 函数进行相乘,进行傅里叶逆变换后得到的即为经过信道的时域信号。

(2)在进行与系统函数相乘时出现错误变成方阵,以及各种行列不匹配的错误让我更加理解matlab是 以矩阵运算为基础这句话。

(3)前后多次结果与预期的差别让我逐渐掌握通过在变量窗口观察变量寻找错误的技巧

(4)通过自主上网搜索资料掌握了一些函数的用法,也解决了一些自己无法解决的问题。

但是感觉程序写的还是比较繁琐不简洁,变量设置太多,结构也有点不清晰,希望以后能在这方面做的更好。

4.程序代码

(1)无失真信道

clc;clear;close all;

%模拟恒参信道%

fs =44100; %定义采样频率

samples = [1,10*fs];

[y,fs]=audioread('D:\MATLAB文件\music\lzw.wav',samples);%输出音频数字信号并取10s

y1=y(:,1); % 抽取第 1 声道

N=length(y1); %长度

%audioread函数按照一定采样频率对信号进行采样,最后结果为一组离散数据,代表音频信号的幅值%

time=(0:N-1)/fs; %时间坐标

%起初横坐标未转换为时间坐标

%共计N个点,T=1/fs采样一次

subplot(331);

plot(time,y1); %原始信号

xlabel('时间/s')

ylabel('幅值')

title('原始信号时域图')

F=fft(y1,N); %对音频信号做离散傅里叶变换

ff=fs/N; %%谱分辨率

f=(0:ff:(N-1)*ff); %%频域坐标

subplot(332);

plot(f,abs(F));

xlabel('频率')

ylabel('幅值')

title('原始信号幅度谱');

%%%%幅频特性

AM=2.*ones(length(f),1);

%幅频特性为一常数2

subplot(333);

plot(f,AM);

title('幅频特性');

%%%%相频特性

PH=0.5.*f;

%相频特性为过零点的直线,斜率0.5即时延Td

subplot(334);

plot(f,PH);

title('相频特性');

%%%%群迟延特性

Td=0.5.*ones(length(f),1);

subplot(335);

plot(f,Td);

title('群迟延特性');

%输出信号%

%幅度

am=abs(F); %先取各个频率点的模值

a=am.*AM; %再让模值经过信道(每个点乘以AM即常数2)

subplot(336);

plot(a);

title('经过信道后的幅度谱');

%相位

theta=angle(F); %先取各个频率点的相位

b=theta+PH'; %再让相位经过信道

%刚开始的错误在于b=theta.*PH',但实际上指数上的加才是乘

%还有一个错误是起初PH未转置导致结果为一个方阵,转置后即一一对应相加

zf=a.*exp(b*1i);

%将经过信道的模值a和经过信道的相位b重新组合,得到输出信号的频域

z=ifft(zf,N); %将输出信号由频域变为时域

%但是这里的zf经过傅里叶逆变换后的结果为一组复数

%上网查阅资料表示为正常现象,只要取结果的实部即可,于是下用real(z)

subplot(337);

plot(time,real(z));

title('经过信道后的时域信号');

audiowrite('real.wav',real(z),fs);

[y3,fs]=audioread('real.wav',samples);

sound(y3,fs);

%将输出信号用audiowrite函数写为文件并播放

(2)失真信道

clc;clear;close all;

%模拟随参信道%

fs =44100; %%定义采样频率

samples = [1,10*fs];

[y,fs]=audioread('D:\MATLAB文件\music\lzw.wav',samples);%输出音频数字信号并取10s

y1=y(:,1); % 抽取第 1 声道

N=length(y1); %长度

time=(0:N-1)/fs; %时间坐标

subplot(331);

plot(time,y1); %原始信号

xlabel('时间/s')

ylabel('幅值')

title('原始信号时域图')

F=fft(y1,N);

ff=fs/N; %%谱分辨率

f=(0:ff:(N-1)*ff); %%频域坐标

subplot(332);

plot(f,abs(F));

xlabel('频率')

ylabel('幅值')

title('原始信号幅度谱');

%%%%幅频特性

AM=2.*f;

%幅频特性改为一条过原点的直线

subplot(333);

plot(f,AM);

title('幅频特性');

%%%%相频特性

PH=0.5.*f.*f;

%相频特性改为一元二次曲线

subplot(334);

plot(f,PH);

title('相频特性');

%%%%群迟延特性

Td=2.*0.5.*f;

%群时延为相频曲线的导数

subplot(335);

plot(f,Td);

title('群迟延特性');

%输出信号%

%幅度

am=abs(F);

a=am.*AM';

subplot(336);

plot(a);

title('经过信道后的幅度谱');

%相位

theta=angle(F);

b=theta+PH'; %相位

zf=a.*exp(b*1i);

z=ifft(zf,N);

distorted=real(z)/100000;

%经过信道后的音频信号幅值过大,导致输出文件时显示被裁剪

%查阅资料后得知audiowrite函数对信号幅值要求[-1,1]

%于是将结果除以100000

subplot(337);

plot(time,distorted);

title('经过信道后的时域信号');

audiowrite('distorted.wav',distorted,fs);

[y3,fs]=audioread('distorted.wav',samples);

sound(y3,fs);

你可能感兴趣的:(matlab,学习,开发语言)