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

article/2025/8/28 1:11:49

目录

  • 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://chatgpt.dhexx.cn/article/8M1XrrrO.shtml

相关文章

信号处理中的反傅里叶变换(IFFT)原理

信号处理中,经常需要将信号转换到频域进行分析,有时候还会从频域转回时域,用到FFT和IFFT函数。 FFT变换是将信号从时域转换到频域,在时域看起来复杂的信号转换到频域看起来就方便容易了很多。但有时候也需要将频域信号转换到时域…

adb下载、安装、环境配置

一:adb安装 adb下载链接:https://pan.baidu.com/s/1Vd6KyZ6vT2Qtmhazwre4OQ 提取码:3dx1 安装: 1.双击adb.exe文件,并运行。 2.添加环境变量: 右击计算机–属性—高级系统设置—高级—环境变量—新建&…

windows下载安装adb(极其简单)

单独安装adb,不安装sdk 下载adb Google很好的心,直接放出ADB的档案供人下载。下档路径如下: Windows版本:https://dl.google.com/android/repository/platform-tools-latest-windows.zip Mac版本:https://dl.google…

ADB-adb命令安装app

下载adb 安装adb 将名称中含有adb的文件,和fastboot.exe复制到 c:/windows/system32目录将名称中含有adb的所有文件复制到 c:/windows/system目录将adb.exe和AdbWinApi.dll复制到c:/windows/SysWoW64目录 有线安装apk 连接上数据线,然后把手机开发者模…

adb详细教程(一)-下载安装与环境变量配置

对于Android开发来说,adb是再熟悉不过的调试工具 但其实对于移动端的测试来说,adb也是一个十分重要的、能够提高测试工作效率的工具。 文章目录 一、介绍二、下载地址三、安装四、配置环境变量 一、介绍 全称 adb全称全称为Android Debug Bridge&#x…

mac下载安装adb环境

目录 方法一1、下载安装包2、下载完成后进行解压,目录路径注意不得包含中文3、配置环境变量4、验证安装是否成功 方法二1、安装homebrew2、安装adb3、运行adb 方法一 1、下载安装包 安装包下载地址 :https://developer.android.com/studio/releases/pl…

adb工具下载安装

一、adb环境配置 adb即Android Debug Bridge,就是可以通过窗口命令,使在pc端可以调试安卓移动端的一个工具包 我这里是默认电脑已经安装SDK的,如果没有也没关系,直接网上下载一个adb工具包一样的https://developer.android.goo…

adb环境配置

adb环境配置 1.下载工具包 工具包:platform-tools_r30.0.4-windows.zip 获取途径1:链接: https://pan.baidu.com/s/17BiARFlgsQa2wDETmoJIvQ?pwddsd2 提取码: dsd2 获取途径2:https://developer.android.google.cn/studio/releases/plat…

android adb驱动官方下载,adb驱动下载

这里给你简单的介绍一下adb驱动:adb驱动就是电脑与android设备的通信的客户端驱动程序。使用它可以直接操作管理android模拟器或者真实的andriod设备。 adb驱动百科介绍: Android设备(如手机)连接PC时所需要的驱动程序,一般Android设备连接WinXP是无需安装驱动的。 adb的全称…

windows ——adb下载与安装

一、adb下载 链接:https://pan.baidu.com/s/1D3eOkHsuAnZd6WoFEVC7xQ 提取码:sc94 二、adb安装 双击 adb-setup-1.3.exe 安装 可以查看此安装教程[转载]:http://m.mz6.net/detail/4506-13.html 三、adb安装成功验证 键盘快捷键:Wi…

adb下载安装教程(已安装Android studio)

adb下载安装教程(已安装Android studio) ①找到adb.exe的绝对路径如下: ②将绝对路径放入环境变量path中(绝对路径不带入adb.exe) 右击“此电脑”>“属性”>”高级系统设置“>”环境变量“>”path“ 双…

ADB下载及常用命令

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具 文章目录 预先准备adb的平台工具软件包下载配置环境变量 连接设备确认连接状态\查询已连设备USB 连接无线连接(Android11 及以上) 应用管理查看应用列…

ADB 下载地址

adbshell 点击ADBkit下载

mac os adb下载

一 adb安装: 打开终端,输入命令 1.安装homebrew: 方式一:ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 方式二:/bin/zsh -c "$(curl -fsSL https:/…

小知识·adb安装和使用方法

目录 一、adb是什么? 二、adb有什么作用 三、如何启用adb调试 四 如何判断设备连接正常 五 如何下载安装adb 1、adb下载地址: 2、按装步骤 六、adb命令大全 1.查看设备 2.Adb应用管理 3.安装APK 4.卸载APK 5.查看设备信息 5.使用 Monkey 进…

adb下载安装及使用

1.adb下载安装 有两种方法: 1.下载一个adb的压缩包,直接解压,每次在解压的文件夹中执行命令操作即可,或者进行环境变量配置,这样以后无论在哪个文件都可以执行操作。 2.下载了Android Studio的文件中就带有adb&…

adb工具下载及安装

adb工具下载 点击下载adb工具 https://qny.aoarasi.com/software/adb/platform-tools_r33.0.0-windows.zip adb 工具安装 下载后解压 platform-tools_r33.0.0-windows.zip 文件 cmd进入adb.exe所在路径(比如我的在:D:\software\platform-tools_r33.…

AD20-DRC检查

点击下图中的红圈内选项: 就会出现: 第一个红圈可不勾选(可以不创建报告文件),第二个红圈中的填的稍微大一点。 接下来就是: 红圈中是安全间距检查,勾选可以检查板子中的安全间距。之后点击左…

数字后端基本概念介绍drc

今天我们要介绍的数字后端概念是drc。全称design rule check。设计规则检查。这是后端布局布线完成后signoff的一个重要指标。 版图完成后需要做物理验证(physical verification),首先是对版图进行设计规则检查,晶圆代工厂对各自不同工艺参数制定出满足芯…

版图DRC验证

Diva DRC验证 首先将diva的所有规则文件复制到设计库目录点击verify-drc设置switch names(all), rules files,rules library,machine(local)使用verify-masker-explain点击高亮框显示错误提示。…