IDFT的python实现

article/2025/9/26 22:29:29

IDFT

IDFT(Inverse Discrete Fourier Transform), 傅里叶逆变换,可以将频域信号转换到时域中, 它的公式非常简单:
x [ n ] = 1 N ∑ k = 0 N − 1 X [ k ] e j 2 π k n / N x[n] = \frac{1}{N} \sum_{k=0}^{N-1} X[k] e^{j2\pi kn/N} x[n]=N1k=0N1X[k]ej2πkn/N

X [ k ] X[k] X[k]:离散频率下标为k时的频率大小

x [ n ] x[n] x[n]: 离散时域信号序列

N N N: 信号序列的长度,也就是采样的个数

对比我们之前讲过的DFT,两者公式类似,但是注意在DFT中指数带负号,而IDFT中不带

从矩阵的角度看IDFT

DFT的矩阵表示

讲IDFT之前,我们先复习DFT的矩阵表示形式:
[ s 0 0 s 0 1 ⋯ s 0 N − 1 ⋮ ⋮ ⋮ ⋮ s k 0 s k 1 ⋯ s k N − 1 ⋮ ⋮ ⋱ ⋮ s N − 1 0 s N − 1 1 ⋯ s N − 1 N − 1 ] [ x [ 0 ] x [ 1 ] ⋮ x [ n ] ⋮ x [ N − 1 ] ] = [ X [ 0 ] X [ 1 ] ⋮ X [ k ] ⋮ X [ N − 1 ] ] \begin{bmatrix} s_0^0 & s_0^1 & \cdots & s_0^{N-1} \\ \vdots & \vdots & \vdots & \vdots\\ s_k^0 & s_k^1 & \cdots & s_k^{N-1} \\ \vdots & \vdots & \ddots & \vdots\\ s_{N-1}^0 & s_{N-1}^1 & \cdots & s_{N-1}^{N-1} \\ \end{bmatrix} \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[n] \\ \vdots \\ x[N-1] \end{bmatrix} = \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[k] \\ \vdots \\ X[N-1] \end{bmatrix} s00sk0sN10s01sk1sN11s0N1skN1sN1N1x[0]x[1]x[n]x[N1]=X[0]X[1]X[k]X[N1]
S S S矩阵中的每一行都是一个 S k S_k Sk向量, S k = e − j 2 π k n / N , n = 0 , 1 , ⋯   , N − 1 S_k = e^{-j2\pi kn/N}, n=0,1,\cdots,N-1 Sk=ej2πkn/N,n=0,1,,N1,进一步简化上面的表示,得到:
[ ⋯ S 0 ⋯ ⋮ ⋯ S k ⋯ ⋮ ⋯ S N − 1 ⋯ ] [ x [ 0 ] x [ 1 ] ⋮ x [ n ] ⋮ x [ N − 1 ] ] = [ X [ 0 ] X [ 1 ] ⋮ X [ k ] ⋮ X [ N − 1 ] ] \begin{bmatrix} \cdots & S_0 & \cdots \\ & \vdots & \\ \cdots & S_k & \cdots \\ & \vdots & \\ \cdots & S_{N-1} & \cdots \\ \end{bmatrix} \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[n] \\ \vdots \\ x[N-1] \end{bmatrix} = \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[k] \\ \vdots \\ X[N-1] \end{bmatrix} S0SkSN1x[0]x[1]x[n]x[N1]=X[0]X[1]X[k]X[N1]

IDFT的矩阵表示

从IDFT的公式,可以看出,其实IDFT和DFT表示是一样的,只是对象发生了变化。具体来说,有两个变化:

  • 由于指数部分不再有符号, S k S_k Sk进行了共轭操作,得到 S k ∗ S_k^* Sk
  • 输入是频率信息X[k]

因此,矩阵表示变成了下面这样:
[ ⋯ S 0 ∗ ⋯ ⋮ ⋯ S k ∗ ⋯ ⋮ ⋯ S N − 1 ∗ ⋯ ] [ X [ 0 ] X [ 1 ] ⋮ X [ n ] ⋮ X [ N − 1 ] ] = [ x [ 0 ] x [ 1 ] ⋮ x [ k ] ⋮ x [ N − 1 ] ] \begin{bmatrix} \cdots & S_0^* & \cdots \\ & \vdots & \\ \cdots & S_k^* & \cdots \\ & \vdots & \\ \cdots & S_{N-1}^* & \cdots \\ \end{bmatrix} \begin{bmatrix} X[0] \\ X[1] \\ \vdots\\ X[n] \\ \vdots \\ X[N-1] \end{bmatrix} = \begin{bmatrix} x[0] \\ x[1] \\ \vdots\\ x[k] \\ \vdots \\ x[N-1] \end{bmatrix} S0SkSN1X[0]X[1]X[n]X[N1]=x[0]x[1]x[k]x[N1]

Talk is cheap, show me the code

接下来就简单多了,我们将先介绍如何使用scipy中ifft,然后自己动手实现一份ifft

导入必要的包

import numpy as np
from scipy.fftpack import fft, ifftimport matplotlib.pyplot as plt%matplotlib notebook

生成信号用于测试

def generate_sine(N, A, fs, f0, phi):'''N : number of samplesA : amplitudefs: sample ratef0: frequencyphi: initial phase'''T = 1/fsn = np.arange(N)x = A*np.cos( 2*np.pi*f0*n*T + phi )return x# generate signal
N = 501
A = 0.8
fs = 44100
f0 = 1000
phi = 0.0x = generate_sine(N, A, fs, f0, phi)plt.figure()
plt.plot(x)
plt.show()

png

使用scipy中的ifft

# fft the signal
N = 512                       # fft size
X = fft(x, N)
mX = np.abs(X)
pX = np.angle(X)freq_axis = np.arange(N)/N * fs
plt.figure(figsize=(10, 12))
ax = plt.subplot(3,1,1)
plt.plot(freq_axis, mX)
ax.set_title('Magnitude')ax = plt.subplot(3,1,2)
plt.plot(freq_axis, pX)
ax.set_title('Phase')# ifft it
ifft_x = ifft(X)
ax = plt.subplot(3,1,3)
plt.plot(ifft_x)
ax.set_title('Synthesise')plt.show()

png

自己动手写ifft

只有两个地方要注意:

  • 不要忘记乘上 1/N
  • S k ∗ S_k^* Sk S k S_k Sk向量的共轭后的结果。反映在代码中,就是 S k ∗ S_k^* Sk不要共轭操作之间返回
def generate_complex_sinusoid(n, N):'''n : time index (or frequency index)N : number of sample'''k = np.arange(N)c_sin = np.exp(1j*2*np.pi*k*n/N)return c_sin# ifft loop
ifft_x = np.array([])for i in range(N):s = generate_complex_sinusoid(i, N)ifft_x = np.append(ifft_x, 1/N * np.sum(X*s))plt.figure()
plt.plot(ifft_x)
plt.show()

png

总结

通过自己动手,我们发现IDFT的原来和实现很简单,几乎与DFT一模一样,唯一需要注意的点就是 S k ∗ S_k^* Sk


http://chatgpt.dhexx.cn/article/wcEAOgw8.shtml

相关文章

一文搞懂:FT、DTFT、DFT、IDFT

一文搞懂:FT、DTFT、DFT、IDFT 写在前面一切为了计算机的处理推导步骤 总结 写在前面 近期重温了一下可爱的数字信号处理,又回想起当初被 FT、DTFT、DFT、IDFT 这几兄弟折腾的傻傻分不清的日子,今天特地在此对它们进行一个梳理。 珠玉在前&a…

LDUOJ spj 修改

特判使用教程 感谢涛巨 记录一下,省的以后忘记了。 /* Utility functions for writing output validators for the Kattis* problem format.** The primary functions and variables available are the following.* In many cases, the only functions needed are …

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评 配置 设置

noip 2022 第二题 喵了个喵 meow 在 Lemon LemonLime 中 SPJ Special Judge 测评配置设置 比赛目录如下&#xff1a; 用户程序(meow.cpp)如下&#xff1a; #include <bits/stdc.h> using namespace std;template<typename T> inline void read(T &x) {x 0; …

数据库例题(创建数据库SPJ包含S、P、J和SPJ表)

目录 运行说明 例题 例题解答 运行说明 1、运行环境&#xff1a;win10 2、所需步骤&#xff1a; &#xff08;1&#xff09; 通过PowerDesigner软件创建逻辑数据模型(CDM)&#xff0c;再将其转换为物理数据模型(PDM)&#xff0c;再导出为SQL语句。 &#xff08;2&#xff…

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 a

精度需要SPJ 入门&#xff1a; 题目&#xff0c;以整数形式给定圆的半径&#xff0c;输出该圆的周长&#xff0c;该圆的面积。 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; circle1.in 1 circle1.ans 6.283185 3.141593 circle2.in 2 circle2.ans 12.566370 12…

数据库---[复习2]---数据查询---设有一个SPJ数据库,包括S、P、J及SPJ4个关系模式··· ···

文章目录 问题重述数据表S表&#xff1a;P表&#xff1a;J表&#xff1a;SPJ表&#xff1a; 问题解析1. 找出所有供应商的姓名和所在城市2. 找出所有零件的名称&#xff0c;颜色&#xff0c;重量3. 找出使用供应商S1所供应零件的工程号码4. 找出工程项目J2使用的各种零件的名称…

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 c

多解需要SPJ 入门&#xff1a; 题目&#xff1a;输出 Hello, World!&#xff0c;大小写不限。 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; string1.in(空文件&#xff0c;里面没有任何内容) string1.ans Hello, World! 用户程序(string.cpp)如下&#xff1a; …

Lemon LemonLime 中 SPJ Special Judge 使用 实践 入门 b

多解需要SPJ 入门&#xff1a; 题目&#xff1a;给出一个不小于12的正整数n&#xff0c;请你输出两个合数&#xff0c;使他们的和等于n,注意&#xff0c;每个测试&#xff0c;有多组测试数据. 比赛目录如下&#xff1a; 标准输入输出数据如下&#xff1a; sum1.in 2 12 13 sum1…

如何配置luogu,codeforces的spj(special judge)

洛谷的spj配置很资瓷啊&#xff0c;以下部分引用来自luogu官方链接 codeforces同理 https://www.luogu.org/wiki/show?name%E5%B8%AE%E5%8A%A9%EF%BC%9Aspecial%20judge 搞了一上午1020导弹拦截的spj step1 先从链接中下载那个testlib-master文件解压后&#xff0c;在那个…

SPJ数据库例题(数据库实验)

题目内容&#xff1a; 设有一个SPJ数据库&#xff0c;包括S&#xff0c;P&#xff0c;J&#xff0c;SPJ四个关系模式&#xff1a; S&#xff08;SNO&#xff0c;SNAME&#xff0c;STATUS&#xff0c;CITY&#xff09;&#xff1b; P&#xff08;PNO&#xff0c;PNAME&#xff0…

mysql建立spj_数据库概论——SQL练习一(SPJ零件问题)

系统: MySQL 8.0.19 题目: 三张表: S(SNO, SNAME, STATUS, CITY) P(PNO, PNAME, COLOR, WEIGHT, CITY) J(JNO, JNAME,CITY) SPJ(SNO, PNO, JNO, PRICE, QTY) S表示供应商,各属性依次为供应商号,供应商名,供应商状态值,供应商所在城市; P表示零件,各属性依次为零件号,…

SPJ数据库例题

1道论述题&#xff1a; 书本P71页习题6&#xff1a; 设有一个SPJ数据库&#xff0c;包括S&#xff0c;P&#xff0c;J&#xff0c;SPJ四个关系模式&#xff1a; S&#xff08;SNO&#xff0c;SNAME&#xff0c;STATUS&#xff0c;CITY&#xff09;&#xff1b; P&#xff08;P…

sql spj

一 select sno,snamevar from student; select sno,snamevar,sdeptvar from student; select * from student; select snamevar,2014-age from student; select snamevar,‘year of birth’,2014-age,lower(sdeptvar) from student; select snamevar from student where …

浅谈online judge平台 spj [special judge] 使用 | 修改问题

浅谈oj平台 spj 使用 | 修改问题 首先&#xff1a;参数对应返回值代码提交几种spj第一种&#xff1a;简单的一类特判第二种&#xff1a;多组输入的特判第三种&#xff1a;需要判断特殊情况[impossible]第四种&#xff1a;带有[testlib.h]的spj第五种&#xff1a;GCPC [German C…

HUSTOJ SPJ 示例

什么是 SPJ SPJ 是 Special Judge 的意思。 什么时候使用 SPJ 当题目答案不止一个的时候&#xff0c;我们就必须使用 SPJ。 如何使用 SPJ 题目中打开 SPJ 首先&#xff0c;我们需要在出题的时候&#xff0c;增加 SPJ 选项&#xff0c;如下图所示。 题目保存后&#xff0…

《数据库原理与运用》上机实验之SPJ

《数据库原理与运用》上机实验之SPJ 前言一、关系模式二、使用SQL语句创建、修改基本表1.对基本表字段名的增加2.对基本表字段名的增加3.索引 二、使用SQL语句对数据库表的单表查询1.对指定列的查询2.对表达式计算和改变表达方式的查询3.消除重复行的查询4.WHERE条件查询5.分组…

SPJ数据库查询

起始 SQL语句建表 建表 后续图示为在SQL Server Management Studio中快捷创建的&#xff0c;并不是代码创建的。 CREATE TABLE S ( SNO CHAR(2) UNIQUE, SNAME CHAR(6), STATUS CHAR(2), CITY CHAR(4));CREATE TABLE J (JNO CHAR(2), JNAME CHAR(8), CITY CHAR(4) ); CREATE …

二 DeepinV20版本安装

安装 https://www.deepin.org/zh/download/ 准备工作&#xff1a;一个U盘&#xff0c;4G就够&#xff1b;镜像包&#xff1b;老毛桃或是官网提供的启动工具。 分区规划&#xff1a;至少3个区&#xff0c; 一个挂 / &#xff08;建议至少10G&#xff09;, SWAP分区&#xff08…

Windows10+deepin双系统安装(选用意义,安装教程)

1.为什么选用deepin 为什么要选用deepin&#xff0c;想必能看到该篇文章&#xff0c;肯定知道deepin是linux系统&#xff0c;而linux系统的发行版众多&#xff0c;至于具体那些&#xff0c;又有什么区别&#xff0c;请读者参考https://blog.csdn.net/bernin/article/details/83…

Deepin安装NVIDIA显卡驱动

显卡驱动可以通过官方库安装&#xff0c;本文使用官方NVIDIA 驱动手动安装。 时间&#xff1a;2020.8 系统版本&#xff1a;Deepin v20 beta Nvidia驱动安装 1 下载驱动 进入NVIDIA官网下载Linux驱动&#xff1a;NVIDIA官网驱动下载 找到对应驱动后下载&#xff0c;记住下载位…