matlab 傅里叶变换频谱

简介: matlab 傅里叶变换频谱 ,搬运自本人csdn博客

初级操作整理

创建一个一维数组

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后,在频谱中正弦波的频率下会得到这个区间的均值,趋势同原函数像

目录
相关文章
|
6月前
|
算法
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:滑动平均滤波算法去噪及谱相减算法呈现频谱
187 0
|
6月前
|
算法
【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:SG滤波算法去噪及谱相减算法呈现频谱
247 1
|
6月前
|
算法
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
155 0
|
6月前
|
算法 计算机视觉
基于CMFB余弦调制滤波器组的频谱响应matlab仿真
基于CMFB余弦调制滤波器组的频谱响应matlab仿真
|
6月前
|
编解码 算法 计算机视觉
【MATLAB】 小波分解信号分解+FFT傅里叶频谱变换组合算法
【MATLAB】 小波分解信号分解+FFT傅里叶频谱变换组合算法
216 0
|
6月前
|
算法
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
90 2
|
6月前
|
算法
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:卷积滑动平均滤波算法去噪及谱相减算法呈现频谱
123 0
|
6月前
|
算法
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
143 1
|
6月前
|
算法
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:高斯加权移动平均滤波算法去噪及谱相减算法呈现频谱
254 0
|
1月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。

热门文章

最新文章

下一篇
无影云桌面