作业帮 > 综合 > 作业

求大神帮忙改错,MATLAB程序如下

来源:学生作业帮 编辑:搜狗做题网作业帮 分类:综合作业 时间:2024/06/24 11:09:43
求大神帮忙改错,MATLAB程序如下
function owen() %自编的czt对比fft
clear;clc;
t=0:0.001:1;
h=3*sin(2*pi*120*t)+2*cos(2*pi*280*t);
Fs=1000;
f1=100;
f2=300;
m=length(h);
w=exp(-1i*2*pi*(f2-f1)/(m*Fs));
a=exp(1i*2*pi*f1/Fs);
y=fft(h,m);
z=func_czt(h,m,w,a);
fy=(0:m-1)*Fs/m;
fz=(0:m-1)*(f2-f1)/m+f1;
subplot(2,1,1);
plot(fy,abs(y));
title('fft');
subplot(2,1,2);
plot(fz,abs(z));
title('chirp z') ;
function z = func_czt(h,m,w,a)
len1 = length(h);
nlist = (0 : 1 : len1-1).';
x1 = h .* a.^(-nlist) .* w.^(nlist.^2 / 2);
n1 = 2^nextpow2(len1 + m - 1);
h1 = [w.^(-(0 : 1 : m-1).'.^2/2); zeros(n1 - (m + len1 - 1), 1); w.^(-(-len1+1 : 1 : -1).'.^2/2)];
y1 = ifft(fft(x1, n1) .* fft(h1));
z = y1(1 : 1 : m) .* w.^((0 : 1 : m-1).'.^2 / 2);
程序主要目的是实现function z = func_czt(h,m,w,a)与matlab中的fft对比
求大神帮忙改错,MATLAB程序如下
fft是宽带分析工具. 频率步长 = fs / m = 1000 / 1001 ≈ 1 Hzczt是窄带分析工具, 频率步长 = (f2 - f1) / m = (300 - 100) / 1001 ≈  0.2 Hz信号主瓣宽度等于 2 / 1 = 2 Hz,当使用fft时, 频率分辨率太低,在主瓣只采集了两点,可以把h=3*sin(2*pi*120*t)+2*cos(2*pi*280*t);  改成h=3*sin(2*pi*120.5*t)+2*cos(2*pi*280.5*t);  再看看效果, 可以但到幅度明显与修改之前不同. 失真严重.而czt 分辨率是0.2Hz, 主瓣采集了10点. 因此幅度始终很准确. 以上用到了频谱分析的一些知识, 希望对你有帮助
再问: 又是你。。。。
再答: 是啊
再问: m=length(h)改成m=1001;么?
再答: m 关系不大, 加1, 减1都不会对结果有明显的影响.
你这段代码问题还是语法不熟悉.
t=0:0.001:1;
改成
t=(0:0.001:1).';
试试看
再问: 额,我不仅语法不熟悉,我还基础知识不扎实。。。我只知道.*是序列的点乘,.'是什么?
再答: 行变列
再问: 我不小心把function z = func_czt(h,m,w,a)内的一些东西改动了,
不过现在改粗来啦~~谢谢您