数字信号处理基础(二):FFT和IFFT的使用以及详细分析代码书写思路

news2024/11/17 10:58:54

目录

  • 1. fft和ifft的原理
    • 1.1 fft
    • 1.2 ifft
  • 2. 书写代码思路
  • 3. 完整代码
  • 4. 结果图

1. fft和ifft的原理

1.1 fft

fft是快速傅里叶变换,是MATLAB中计算信号频谱的函数,使用方法是fft(x),直接对信号x进行fft计算。
由于fft函数计算信号的频谱是0-fs范围的,但是我们更习惯观察的信号的双边频谱,即-fs/2-fs/2范围的频谱,因此常用fftshift(x)函数将0-fs范围的信号频谱搬移到-fs/2-fs/2范围,也就是将原来0-fs范围中的fs/2-fs范围的频谱搬移到-fs/2-0范围处。

1.2 ifft

ifft是快速逆傅里叶变换,是MATLAB中求信号的逆傅里叶变换的函数,使用方法是ifft(x)。

2. 书写代码思路

1.养成良好习惯,在代码的最上面书写三件套代码,该清除的清除。

clear all;                  % 清除所有变量
close all;                  % 关闭所有窗口
clc;                        % 清屏

2.确定各个信号的频率以及信号的最高频率,本例中信号是正弦信号和余弦信号之和,分别确定各个信号频率,以及信号的最高频率,这里是3000Hz

fc1 = 1000;                 % 信号1的中心频率
fc2 = 3000;                 % 信号2的中心频率

3.根据信号的最高频率和奈奎斯特采样定理确定采样频率(大于信号最高频率的2倍即可),本人为了时域信号的平滑,通常将采样频率设置为最高频率的30倍左右。

fs = 100000;                % 采样频率,满足奈奎斯特采样定理即可,这里为信号频率的33倍原因是为了采样点数多,时域波形平滑

4.根据采样频率求得采样间隔,即采样频率的倒数

dt = 1/fs;                  % 采样间隔

5.确定仿真信号时长,这个一般根据实际情况来定,例如在通信系统中,首先需要确定码元周期,然后确定码元个数,两者相乘即是仿真时长,在本例中设置的时长是0.1。

T = 0.1;                    % 采样总时长

6.确定采样点数,为采样时长除以采样间隔。

N = T*fs;                   % 采样点数,N=T/dt=T*fs

7.确定仿真时间变量,从0开始,以采样间隔为间隔,形成1*N的行向量

t = 0:dt:(N-1)*dt;          % 时间行向量,间隔为dt

8.产生信号,并且绘制图像。

sig = sin(2*pi*fc1*t)+cos(2*pi*fc2*t);% 信号
figure(1);                  % 绘制第1幅图
plot(t,sig,'LineWidth',2);  % 绘制信号波形
axis([0 0.002 -2 2]);       % 坐标轴范围设置
xlabel('时间/t');           % 横坐标标签
ylabel('幅值');             % 纵坐标
title('原始信号');          % 标题
grid on;                    % 打开网格线

9.对信号进行fft,fft三步走

sig_f = fft(sig);           % 对信号进行fft
sig_f_2 = abs(sig_f);       % fft后取绝对值得到幅度响应
sig_f_2 = fftshift(sig_f_2);%0-fs频谱移动到-fs/2-fs/2

10.确定频谱分辨率fs/N=1/T

df = 1/T;                   % 频谱分辨率fs/N=1/T

11.确定频谱范围,即-fs/2-fs/2,间隔为频谱分辨率

f=(-N/2:N/2-1)*df;          % 频率范围

12.绘制频谱

figure(2);                  % 绘制第2幅图
plot(f,sig_f_2,'LineWidth',2);% 绘制信号的频谱
axis([-5000 5000 -inf inf]);% 坐标轴范围设置
xlabel('频率/Hz');          % 横坐标标签
ylabel('幅值');             % 纵坐标
title('原始信号的频谱');    % 标题
grid on;                    % 打开网格线

13.对信号做ifft,这里是对fft后的信号sig_f进行ifft,而不是对进行fft三步走后的信号sig_f_2进行ifftshift,然后进行ifft,因为三步走中有一步是取绝对值,通过ifftshift然后ifft无法准确还原出原始信号,因此为了还原出原始信号,应该对fft后的信号sig_f进行ifft,这也是为什么要三步走的原因,而不采用一行生成的代码fftshift(abs(fft(x)))。

sig_ifft = ifft(sig_f);     % 对fft后的信号进行ifft还原成时域信号

14.绘制还原后信号图像

plot(t,sig_ifft,'LineWidth',2);% 绘制还原后的时域信号
axis([0 0.002 -2 2]);       % 坐标轴范围设置
xlabel('时间/t');           % 横坐标标签
ylabel('幅值');             % 纵坐标
title('还原后信号');        % 标题
grid on;                    % 打开网格线

3. 完整代码

clear all;                  % 清除所有变量
close all;                  % 关闭所有窗口
clc;                        % 清屏
%% 基本参数
fc1 = 1000;                 % 信号1的中心频率
fc2 = 3000;                 % 信号2的中心频率
fs = 100000;                % 采样频率,满足奈奎斯特采样定理即可,这里为信号频率的33倍原因是为了采样点数多,时域波形平滑
dt = 1/fs;                  % 采样间隔
T = 0.1;                    % 采样总时长
N = T*fs;                   % 采样点数,N=T/dt=T*fs
t = 0:dt:(N-1)*dt;          % 时间行向量,间隔为dt
sig = sin(2*pi*fc1*t)+cos(2*pi*fc2*t);% 信号
figure(1);                  % 绘制第1幅图
plot(t,sig,'LineWidth',2);  % 绘制信号波形
axis([0 0.002 -2 2]);       % 坐标轴范围设置
xlabel('时间/t');           % 横坐标标签
ylabel('幅值');             % 纵坐标
title('原始信号');          % 标题
grid on;                    % 打开网格线
sig_f = fft(sig);           % 对信号进行fft
sig_f_2 = abs(sig_f);       % fft后取绝对值得到幅度响应
sig_f_2 = fftshift(sig_f_2);%0-fs频谱移动到-fs/2-fs/2
df = 1/T;                   % 频谱分辨率fs/N=1/T
f=(-N/2:N/2-1)*df;          % 频率范围
figure(2);                  % 绘制第2幅图
plot(f,sig_f_2,'LineWidth',2);% 绘制信号的频谱
axis([-5000 5000 -inf inf]);% 坐标轴范围设置
xlabel('频率/Hz');          % 横坐标标签
ylabel('幅值');             % 纵坐标
title('原始信号的频谱');    % 标题
grid on;                    % 打开网格线
sig_ifft = ifft(sig_f);     % 对fft后的信号进行ifft还原成时域信号
figure(3);                  % 绘制第3幅图
plot(t,sig_ifft,'LineWidth',2);% 绘制还原后的时域信号
axis([0 0.002 -2 2]);       % 坐标轴范围设置
xlabel('时间/t');           % 横坐标标签
ylabel('幅值');             % 纵坐标
title('还原后信号');        % 标题
grid on;                    % 打开网格线

4. 结果图

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/545715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国考省考行测:资料分析,两年复合增长率

国考省考行测:资料分析,两年复合增长率 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡…

考研算法第十三天:二叉排序树 【二叉排序树的插入和遍历】

这道题很妙。题目给的二叉排序树好像没学过其实就是二叉查找树。然后这道题主要的就是思路 1.节点的初始化(记住) struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; 2.节点的插入 …

HTTPS 的加密流程

文章目录 前言一.HTTPS 是什么二."加密" 是什么四.HTTPS解决了哪些问题五.HTTPS 的工作过程对称加密非对称加密引入证书 前言 本文介绍了HTTPS的加密流程,以及HTTPS在保护用户数据安全和确保通信机密性方面的重要性。通过详细解释HTTPS的工作原理和加密流…

网络安全里的主要岗位有哪些?小白如何快速入门?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等,每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低,也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程👇 网…

ChatGPT:世界已经永远改变了,而大多数人尚无所觉

1、你发现没有,现在跟朋友交流,言必聊ChatGPT。几乎所有人都在蹭GPT的热度,无论是头部企业还是普通的个人开发者,都想趁着ChatGPT东风狂赚一笔。有卖ChatGPT账号的、有借用ChatGPT的API集成服务让人付费试用的,还有人利…

Android第一代加壳技术的验证、测试和探究

Android第一代加壳测试,网上有很多文章,本文只是在前人基础上测试和验证。因此,本文的重点在于动手和实践。 第一代加壳技术有三个项目,分别是: 加壳程序。主要是把需要加壳的原程序加密后,放在壳程序中&…

全能超高清解码播放器_完美解码

哈喽,大家好。今天给各位小伙伴们测试了一款全能超高清解码播放器——完美解码。 这是一款为众多影视发烧友精心打造的专业高清播放器。超强HDTV支持,画质远超主流播放器!全面开启硬件加速,CPU资源占用低,强劲高清解码…

Matplotlib绘制漂亮的饼状图|python绘制漂亮的饼状图

python绘图系列文章目录 往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 python随机…

LeetCode刷题 --- 栈

栈(stack)是一种用于存储数据的简单数据结构。栈一个有序线性表,只能在表的一端(PS:栈顶)执行插人和删除操作。最后插人的元素将被第一个删除。所以,栈也称为后进先出(Last In First…

AI在狂飙,ChatGPT-4可直接在iPhone上使用啦

今天凌晨,OpenAI 正式在 App Store 推出了 ChatGPT 的 iOS app,瞬间冲上苹果商店免费榜第二名,效率榜第一名。 于是兴致勃勃的去下载体验了一番。整体不错,以后手机使用官方的 ChatGPT 更方便啦!而且使用 GPT4 不再麻…

JavaScript事件流

一、事件流和它的两个阶段 1.事件流:是事件完整执行过程中的流动路径 2.说明:假设页面里有个div,当触发事件时,会经历两个阶段,分别是捕获阶段、冒泡阶段 (1)捕获:从父到子 &#…

测试工程师都是怎么写测试用例的?​

很多人不知道写测试用例有什么用,而仅仅是像工具人一样,在每次提测之前,把测试用例照着需求文档抄一遍,仿佛像是走个过场。 开发提测之后,就照着测试用例点点点,可能一天就走完用例了,开发代码…

最优化理论-线性规划中的大M法的步骤

目录: 一、引言 二、线性规划的基本概念 三、最优化理论中的大M法 1. 大M法的基本思想 2. 大M法的步骤 3. 大M法的优缺点 四、大M法的应用 1. 生产计划问题 2. 运输问题 3. 投资问题 五、总结 一、引言 最优化理论是数学中的一个重要分支…

【2023/05/19】NFA

Hello!大家好,我是霜淮子,2023倒计时第14天。 非确定有限状态自动机(NFA)是一种模拟复杂系统行为的数学模型 目录 一、基本概念和理论 二、优点和缺点 三、应用场景 四、问题和挑战 五、重要性、作用和使用价值 …

学习HCIP的day.07

目录 7、SPF算法 --- OSPF防环机制 OSPF区域间防环 OSPF域外防环 基于以上长篇理论总结: 7、SPF算法 --- OSPF防环机制 (1)在同一个区域每台路由具有一致的LSDB (2)每台路由器以自己为根计算到达每个目标的最短路…

Java泛型,数组和方法返回类型 - 协变,逆变和不变

首先,让我们通常理解一下子类型规则是什么。 协变vs逆变vs双变vs不变 编程语言可能有支持以下子类型规则的特性: 协变 允许用超类型替换子类型。 逆变 允许用子类型替换超类型。 双变 同时是协变和逆变。 不变 不允许上述任何替换。 让我们看看Java支持哪…

Intellij IDEA 如何删掉插件

在 Intellij IDEA 的配置中,找到插件选项。 在插件选项中,选择需要删除的插件,然后在右侧的对话框中选择 uninstall 就可以了。 卸载以后,可能不会要求重启,为了安全起见,还是重启下你的 IDE 吧。

C++容器详解

什么是容器 首先,我们必须理解一下什么是容器,在C 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。很简单,容器就是保存其它对…

Flutter控件之文本Text封装

Flutter控件之基类Widget封装 上篇文章,我们简单针对Widget做了一个基类封装,拓展出了很多常见又易用的属性,比如宽高,内外边距等等,很方便的为接下来的各个基础组件的封装,提供极大的便利,在上…

虚拟机启动时出现“已启用侧通道缓解”的解决方法

系列文章目录 Hypervisor launch failed centos7配置ssh免密登陆完成,进行ssh登陆时出现”代理承认未能使用密钥签名“ 解决pip更新的代码 文章目录 系列文章目录 一、问题描述 二、启用了侧通道缓解的虚拟机可能会出现性能下降 (79832&#xff0…