Matlab 怎么对信号进行采样
1个回答
2016-11-08
展开全部
任意信号的采样后恢复是有条件的,必须是采样频率大于两倍的信号截至频率才行。
//文件名 main.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
clear;
clc;
f0=10000; %用来模拟 模拟信号的 数字信号的采样频率 fs<<f0
f=[10 50 100];%f是模拟信号的频率表 max(f)<250;
fs=500; %信号的采样频率
N=500;%数字信号的样点数
%模拟信号的生成
s=signal_generate(f,f0,N);
subplot(4,1,1);plot(s);axis([1 N min(s) max(s)]);
%采样点数,间隔的计算
deltaN=f0/fs
Ns=N/deltaN
%采样
for i=1:Ns
sd(i)=s((i-1)*deltaN+1);
end
subplot(4,1,2);stem(sd,'.');axis([1 Ns min(s) max(s)]);
%恢复出方波信号
sp=[];
for i=1:Ns
sp=[sp sd(i)*ones(1,deltaN)];
end
subplot(4,1,3);plot(sp);axis([1 N min(s) max(s)]);
%低通滤波恢复出原始信号
Wm=fs/f0
level=5/Wm
b=low_filter(Wm,level);
delay=level/2;
sp=[sp zeros(1,delay)];
so=filter(b,1,sp);
so=so(delay+1:delay+N)/deltaN;
subplot(4,1,4);plot(so);axis([1 N min(s) max(s)]);
//文件名 signal_generate.m
function s=signal_generate(f,f0,N)
f0=10000;
num=length(f);
s=zeros(1,N);
for i=1:num
s=s+sin(f(i)*2*pi*(1:N)/f0);
end
//文件名 low_filter.m
function b=low_filter(Wm,level);
Nm=ceil(Wm/2*level);
H=zeros(1,level);
H(1:Nm)=ones(1,Nm);
H(Nm+1)=0.5;
H(level-Nm+1)=-0.5;
H(level-Nm+2:level)=-ones(1,Nm-1);
theta=-(level-1)/level*pi*(0:level-1); %phase
Hg=H.*exp(j*theta);
b=real(ifft(Hg));
b=b/(sum(b.^2));
新建这三个文件后,拷贝在统一个目录里,运行main.m就可以了, 每一个过程都有相应的图形显示。
//文件名 main.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
clear;
clc;
f0=10000; %用来模拟 模拟信号的 数字信号的采样频率 fs<<f0
f=[10 50 100];%f是模拟信号的频率表 max(f)<250;
fs=500; %信号的采样频率
N=500;%数字信号的样点数
%模拟信号的生成
s=signal_generate(f,f0,N);
subplot(4,1,1);plot(s);axis([1 N min(s) max(s)]);
%采样点数,间隔的计算
deltaN=f0/fs
Ns=N/deltaN
%采样
for i=1:Ns
sd(i)=s((i-1)*deltaN+1);
end
subplot(4,1,2);stem(sd,'.');axis([1 Ns min(s) max(s)]);
%恢复出方波信号
sp=[];
for i=1:Ns
sp=[sp sd(i)*ones(1,deltaN)];
end
subplot(4,1,3);plot(sp);axis([1 N min(s) max(s)]);
%低通滤波恢复出原始信号
Wm=fs/f0
level=5/Wm
b=low_filter(Wm,level);
delay=level/2;
sp=[sp zeros(1,delay)];
so=filter(b,1,sp);
so=so(delay+1:delay+N)/deltaN;
subplot(4,1,4);plot(so);axis([1 N min(s) max(s)]);
//文件名 signal_generate.m
function s=signal_generate(f,f0,N)
f0=10000;
num=length(f);
s=zeros(1,N);
for i=1:num
s=s+sin(f(i)*2*pi*(1:N)/f0);
end
//文件名 low_filter.m
function b=low_filter(Wm,level);
Nm=ceil(Wm/2*level);
H=zeros(1,level);
H(1:Nm)=ones(1,Nm);
H(Nm+1)=0.5;
H(level-Nm+1)=-0.5;
H(level-Nm+2:level)=-ones(1,Nm-1);
theta=-(level-1)/level*pi*(0:level-1); %phase
Hg=H.*exp(j*theta);
b=real(ifft(Hg));
b=b/(sum(b.^2));
新建这三个文件后,拷贝在统一个目录里,运行main.m就可以了, 每一个过程都有相应的图形显示。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |