初级操作整理
创建一个一维数组
zeros(1,n)%建立一個一行N列的一维数组
创建一个正弦数组
Si = zeros(1,n)
i = 0;
for j = 1:N
i = i+1;
Si(i) = sin(2*pi*i/N);
end
显示一下看一眼
plot(Si)
FFT使用
代码
找到了一个理想的FFT处理的代码,
%% 两个频率分别为15HZ 和 20HZ 的正弦信号[1]
Fs=500;%采样率
f1=15;
f2=20;
t = 0:1/Fs:1-1/Fs; %以1/Fs为步距从0取到1-1/Fs,组成一维数组
x = 200*sin(2*pi*f1*t) + 0.25*sin(2*pi*f2*t);%输入信号
figure;
plot(t,x);%原始图像显示
y = fft(x);% fft变换
%将横坐标转化,显示为频率f= n*(fs/N)
f = (0:length(y)-1)*Fs/length(y);
figure;
plot(f,abs(y));%abs 对负数取绝对值,对复数取幅值
title('Magnitude');
%该变换还会生成尖峰的镜像副本,该副本对应于信号的负频率。
%为了更好地以可视化方式呈现周期性,可以使用 fftshift 函数对变换执行以零为中心的循环平移。
n = length(x);
fshift = (-n/2:n/2-1)*(Fs/n);%以输入长度为参照向两边做均匀点生成图像横坐标
yshift = fftshift(y);
figure;
plot(fshift,abs(yshift));
%FFT的结果所要展现的真实的频谱幅值[2]
realy=2*abs(y(1:n/2+1))/n;
realf=(0:n/2)*(Fs/n);
figure;
plot(realf,realy);
怎么说呢,输出就和正常的输出一样就不截图了放到matlab 里面自己运行一遍该有的就都有了
程序解析
t = 0:1/Fs:1-1/Fs; %以1/Fs为步距从0取到1-1/Fs,共Fs个点,组成一维数组
x = sin(2*pi*f1*t) + 0.25*sin(2*pi*f2*t);
%y的长度个数细分Fs给f
f = (0:length(y)-1)*Fs/length(y);%f作为作图x
realy=2*abs(y(1:n/2+1))/n;
realf=(0:n/2)*(Fs/n);
主要不懂的是‘:’的用法以及fft fftshift的实现,‘:’的话,自行理解吧,后续的abs是取幅值 ,以及DFT和FT的区别,算了不重要,应该是没大错的,先用吧。
算法解析
有疑问的有两点 一个是
realy=2*abs(y(1:n/2+1))/n;
另个就fft函数本身
暂不分析
关于x的修改
在x的赋值行后加入下列语句,得到了一定程度上的想象中的东西,对结果看不懂,和我在纸上写的傅里叶变换结果不一样,这里转折下去看下这东西怎么玩的吧
for j = 1:2*Fs
x(j) = t(j)*x(j);
end
基础知识
以下都不重要了,现在重点是生成一个这么长的16hz正弦调制后的点阵列长512个,然后截取256为一个段,做fft,处理出来后应该会生成256张图吧,把每个图中17(从1开始)点对应的数做一个数组输出,基本可以确定结果是个什么东西
fft与dft区别
FFT是DFT的一种快速实现算法。
dft与ft区别联系
DTFT:时域离散的傅里叶变换 [注] ==时域离散 但频域依旧连续== 强调的是“离散时间”
DFT:离散傅立叶变换,DFT是为了计算机处理方便,在频率域对DTFT进行的采样并截取主值。得到的数据进行IDFT会得到原图像以一定周期的周期延拓
FT:傅里叶变换 时域频域都连续
graph LR
连续 --- 非周期
离散 --- 周期
配一张这个表:
时域 | 频域 | |
---|---|---|
周期连续 | 非周期离散 | |
FT | 非周期连续 | 非周期连续 |
DFT/FFT | 周期离散 | 周期离散 |
DTFT | 非周期离散 | 周期连续 |
fft怎么实现
没记错的话实部虚部分开处理,一次处理会把上一次的折一半,直到迭代折没为止,拆成两半处理 拆完再拆,具体算法待补充
实验过程基础语法
先把代码贴上来
%% 两个频率分别为1HZ 和 200HZ 的正弦信号[1]
Fs = 256;%采样率
f1 = 16;
f2 = 200;
Len = 256;
t = 0:1/Fs:Len-1/Fs; %以1/Fs为步距从0取到Len-1/Fs,共Len*Fs个点,组成一维数组
%x = sin(2*pi*f1*t) + 0.25*sin(2*pi*f2*t);
x1 = sin(2*pi*f1*t);%生成调制函数
for j = 1:Len*Fs
x1(j) = t(j)*(x1(j)+1);%%对y=x调制
end
figure;
plot(t,x1);
res = zeros(1,Len);%存取结果数组
n=256;
for j = 1:n
x = x1(256*(j-1)+1:256*j);
y = fft(x);
realy =2*abs(y(1:n/2+1))/n;
res(j) = realy(17) ;
end
f = (0:length(res)-1)*Fs/length(res);
plot(f,res);
matlab数组截取一段
x1 = [1,2,3,4,5,6];
x = x1(3:5);%截取 3-5给x 顺带一提 matlab数组从1开始 给0会报错 还有冒号优先级很低 在加号之下
初步结论
函数通过正弦波调制后生成的数据,通过fft后,在频谱中正弦波的频率下会得到这个区间的均值,趋势同原函数像