python实现多帧torch.istft的结果可以由多个单帧torch.istft的结果重叠拼接得到

news2024/11/24 12:09:55

🔥 🔥 🔥 背景:做某个项目(由于项目处于保密状态,只提供思路),需要求多帧的istft。但是手头只有单帧的istft代码(当然不能python代码,不然就直接调包)。

📣 问题1:torch.istft center=True和center=False的区别,通过选取center=False istft结果的[hop_length-1:n_fft+1]片段,就能和center=True istft结果的[:hop_length-1]片段对上。

📣 问题2:如何将两个单帧的torch.istft(out[:,0:1]和torch.istft(out[:,1:2])得到torch.istft(out[:,0:2])的结果。

👉问题1解答:

import torch
from matplotlib import pyplot as plt
x = torch.randn([1,254*4])
n_fft = 254
hop_length = 128
out = torch.stft(x,n_fft=n_fft,hop_length=hop_length,center=False,win_length=n_fft,window=torch.tensor(get_window(n_fft,0.5)), return_complex=True).squeeze()
out1 = torch.istft(out[:,0:1],n_fft=n_fft,center=False,hop_length=hop_length,win_length=n_fft,window=torch.hamming_window(window_length=n_fft, periodic=True), return_complex=False,length=n_fft)
out2 = torch.istft(out[:,0:1],n_fft=n_fft,center=True,hop_length=hop_length,win_length=n_fft,window=torch.hamming_window(window_length=n_fft, periodic=True), return_complex=False,length=n_fft)

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure(figsize=(10,6))
plt.subplot(3,1,1)
plt.plot(out1,label="istft center=False")
plt.plot(out2,label="istft center=True")
plt.title("center=True和center=False的区别")
plt.legend()
plt.subplot(3,1,2)
plt.plot(out1,label="istft center=False")
plt.legend()
plt.subplot(3,1,3)
plt.plot(out2,label="istft center=True")
plt.legend()
plt.show()

在这里插入图片描述

plt.figure(figsize=(10,6))
plt.subplot(3,1,1)
plt.plot(out1[hop_length-1:n_fft+1],label="istft center=False")
plt.plot(out2[:hop_length-1],label="istft center=True")
plt.title("center=True和center=False的区别")
plt.legend()
plt.subplot(3,1,2)
plt.plot(out1[hop_length-1:n_fft+1],label="istft center=False")
plt.legend()
plt.subplot(3,1,3)
plt.plot(out2[:hop_length-1],label="istft center=True")
plt.legend()
plt.show()

在这里插入图片描述

👉问题2解答:

  首先看一下torch.istft(out[:,0:1]),torch.istft(out[:,1:2])和torch.istft(out[:,0:2])的趋势图,通过两图发现两者是存在联系的,但是又不是1+1的关系,经过3天的不懈努力发现两个单帧的数据可以通过overlap重叠拼接在取片段得到。
在这里插入图片描述
  torch.istft(out[:,0:1]),torch.istft(out[:,1:2])经过istft2overlap进行重叠拼接是能和torch.istft(out[:,0:2])对的上的,但是在使用随机数进行提取stft、istft,最终结果存在差异,本博客只提供个思路,具体还要结合业务去实践。
代码参考librosa.stft() 源码分析中的 istft函数

def istft2overlap(x1,x2,):
    ifft_window = torch.hamming_window(window_length=n_fft, periodic=True).numpy()
    n_frames = 2
    expected_signal_len = n_fft + hop_length * (n_frames - 1)
    y = np.zeros(expected_signal_len)
    ifft_window_sum = np.zeros(expected_signal_len)
    ifft_window_square = ifft_window * ifft_window

    for i in range(n_frames):
        sample = i * hop_length
        if i==0:
            y[sample:(sample + n_fft)] += x1
        else:
            y[sample:(sample + n_fft)] += x2
        ifft_window_sum[sample:(sample + n_fft)] += ifft_window_square
    # Normalize by sum of squared window  # 1.1754944e-38
    for i in range(expected_signal_len):
        if ifft_window_sum[i] > 1.1754944e-38:
            y[i] /= ifft_window_sum[i]

    return y.tolist()

out33 = istft2overlap(out1.numpy(),out2.numpy())


plt.figure(figsize=(10,6))
plt.subplot(3,1,1)
plt.plot(out33[hop_length:n_fft],label="torch.istft(out[:,0:2])",color="r")
plt.plot(out3[hop_length:n_fft],label="torch.istft(out[:,0:1])和torch.istft(out[:,1:2]) istft2overlap",color="g")
plt.title("单帧torch.istft和多帧torch.istft的区别和联系")
plt.legend()
plt.subplot(3,1,2)
plt.plot(out33[hop_length:n_fft],label="torch.istft(out[:,0:2])",color="r")
plt.legend()
plt.subplot(3,1,3)
plt.plot(out3[hop_length:n_fft],label="torch.istft(out[:,0:1])和torch.istft(out[:,1:2]) istft2overlap",color="g")
plt.legend()
plt.show()

在这里插入图片描述

纸上得来终觉浅,绝知此事要躬行。

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

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

相关文章

Quartus II 13.0波形仿真(解决无法产生仿真波形问题)

目录 前言 新建工程 创建Verilog文件,写代码 波形仿真(解决没有输出波问题) 前言 这么说把Quartus II 13.0是我目前来讲见过最恶心的软件,总是一大堆麻烦事,稍微哪里没弄好就后面全都出问题。很多人在写完Verilog代…

ke9案例三:页面提交文件,我服务器端接收

案例三:页面提交文件,我服务器端接收 ProcessFile.java 1value "/process-file" 2获取邮件消息的所有部分part--Collection<Part> partsrequest.getParts(); 3遍历每一个part 4之后可以打印头文件等String headerpart.getHeader("content-disposition&q…

配件管理系统软件哪家好?企业配件管理要怎么做?

在许多企业中&#xff0c;生产数据的记录仍然依赖于纸质流转卡&#xff0c;这种传统的方式带来了许多问题。手工填写导致的字迹潦草、数据不准确或不完全、统计困难等都是无法避免的问题。为了解决这些问题&#xff0c;我们推荐使用一款智能配件管理系统&#xff0c;帮助企业从…

Springboot搭建微服务案例之Eureka注册中心

一、父工程依赖管理 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…

常见通信协议

博客内容&#xff1a;UART,IIC,SPI 文章目录 一、UART二、IIC三、SPI总结 一、UART 一种串行通信接口协议&#xff0c;用于在计算机系统和外部设备之间进行数据传输。UART可以支持异步和同步两种通信方式。在异步通信方式下&#xff0c;数据传输不需要在发送方和接收方之间进行…

自学SLAM(7)非线性优化实践:曲线拟合问题(使用ceres库和SLAM常用的g2o库)

前言 本次文章针对的是第四个视屏中的实践问题 肯定会有部分方法没有说到&#xff0c;比如高斯牛顿法&#xff0c;后面我会把此次视屏对应的作业写好&#xff0c;然后补充到此次博客&#xff01;&#xff01; 文章目录 前言1.曲线拟合题目&#xff1a;2.非线性最小二乘2.1 黄金…

网络基础扫盲-初识网络

博客内容&#xff1a;初识网络 文章目录 一、OSI七层网络模型二、TCP/IP四层模型1、MAC地址与IP地址 前言 在以前网络不够发之前&#xff0c;各个实验室进行一些研究时需要进行数据的交流&#xff0c;但是那时车马很慢&#xff0c;一生只够跑几次&#xff0c;所以就有人研究了网…

Reshape.XL 1.2 for Excel插件 Crack

特征 插件 Reshape.XL 包括 130 个基本可组合功能。使用它们&#xff0c;您可以快速轻松地进行非常复杂的数据转换和处理。它们的架构和基本定义受到 SQL 和 R 语言的强烈启发。 到目前为止&#xff0c;类似的功能只能通过脚本语言供程序员使用。借助 Reshape.XL 插件&#xf…

Pyhotn: Mac安装selenium和chromedriver-119

1.0 安装selenium 终端输入&#xff1a; pip install selenium 查看版本&#xff1a; pip show selenium2.0 安装chromedriver 查看chrome版本 网上大多数是&#xff0c;基本到114就停了。 https://registry.npmmirror.com/binary.html?pathchromedriver/ 各种搜索&#…

Java自学第4课:Java数组,类,对象

1 一维数组的创建和使用 2种创建形式&#xff1a; &#xff08;1&#xff09;先声明&#xff0c;再用new分配内存 &#xff08;2&#xff09;声明的同时分配内存 2种幅值形式 &#xff08;1&#xff09;用new{}赋值 &#xff08;2&#xff09;用{}赋值 如果不使用的话&a…

【jvm】虚拟机栈

目录 一、背景二、栈与堆三、声明周期四、作用五、特点&#xff08;优点&#xff09;六、可能出现的异常七、设置栈内存大小八、栈的存储单位九、栈运行原理十、栈帧的内部结构10.1 说明10.2 局部变量表10.3 操作数栈10.4 动态链接10.5 方法返回地址10.6 一些附加信息 十一、代…

【强化学习】16 ——PPO(Proximal Policy Optimization)

文章目录 前言TRPO的不足PPO特点 PPO-惩罚PPO-截断优势函数估计算法伪代码PPO 代码实践参考 前言 TRPO 算法在很多场景上的应用都很成功&#xff0c;但是我们也发现它的计算过程非常复杂&#xff0c;每一步更新的运算量非常大。于是&#xff0c;TRPO 算法的改进版——PPO 算法…

【PyQt学习篇 · ⑪】:QPushButton和QCommandLinkButton的使用

文章目录 构造函数菜单设置扁平化默认处理右键菜单QCommandLinkButton的使用 构造函数 QPushButton的构造函数如下&#xff1a; """QPushButton(parent: Optional[QWidget] None)QPushButton(text: Optional[str], parent: Optional[QWidget] None)QPushButt…

基于动力学模型的机械臂pid控制

参考资料&#xff1a; 一、如何实现机械臂的控制 在最常见的对机械臂动力学实现控制的问题中&#xff0c;我们会有一段机械臂末端的期望轨迹S&#xff0c;希望通过对机械臂关节处电机转矩的控制实现末端沿期望轨迹的完美运动。控制问题主要分为镇定和跟踪两种&#xff0c;上面…

2023/11/4 JAVA学习

通过匿名内部类

verdi技巧分享--合并多个fsdb文件、统计信号边沿

文章目录 0 前言1 如何显示信号高位的02 统计信号的上升沿、下降沿3 合并信号4 将多个fsdb文件合并成一个 0 前言 分享几个这段时间学到的verdi操作 1 如何显示信号高位的0 这个可能对一些有强迫症的有帮助吧 nand相关的操作&#xff0c;有一些特定的cmd&#xff0c;比如 r…

什么是工分排队模式?看懂之后,又能学会一招拓客引流技巧?

什么是工分排队模式&#xff1f;看懂之后&#xff0c;又能学会一招拓客引流技巧&#xff1f; 背景&#xff1a;当下市场行情呈现出经济平稳快速增长的趋势&#xff0c;但同时也存在物价持续上升的情况。从经济角度来看&#xff0c;当前市场行情呈现出经济平稳快速增长的趋势。这…

职场被迫内卷,云认证破局

前言&#xff1a; 2023年作为疫情全面放开的第一年&#xff0c;经济并没有像22年底时我们想象的那样&#xff0c;快速复苏&#xff0c;GDP增长超10%。取而代之的是&#xff0c;2023年经济大环境对各个行业来说&#xff0c;相比22年显的更加艰难&#xff0c;GDP增长预计在5%左右…

Java数组的定义与常用使用方法

目录 一.什么是数组 二.数组的创建及初始化 数组的创建 数组的初始化 动态初始化&#xff1a; 静态初始化&#xff1a; 【注意】 三.数组的使用 数组中元素访问 遍历数组 四.数组作为方法的参数 参数传基本数据类型 参数传数组类型(引用数据类型) 作为方法的返回…

飞行器坐标转换

飞行器坐标转换 坐标系定义方向余弦矩阵 坐标系定义 本文定义的是右手直角坐标系&#xff0c; x − y − z x-y-z x−y−z轴分别为北-天-东。 从 A A A坐标系到 B B B坐标系是分别绕 y − z − x y-z-x y−z−x轴&#xff0c;即天-东-北旋转 ψ − θ − γ \psi-\theta-\gamm…