傅里叶变换的实现

STFT

torch和libsora对比

ISTFT

istft

画时频图

链接

torch.STFT, istft

链接

示例代码

istft

import librosa
import numpy as np
import torch
import soundfile as sf

### 选用torch.STFT
# sigal, fs = librosa.load(r'/home/albert_z/deepLearning/experiment/data/train_noisy/p226_001_0.wav',sr=16000)
# mag,pha = librosa.magphase(librosa.stft(sigal,n_fft=512,win_length=320,hop_length=160,window="hann"))

# print(mag.shape)
# print(pha.shape)
# print(mag.transpose(0,1))
# print(pha.transpose(0,1))

# # enhanced = librosa.istft(noisy_mag * noisy_phase, hop_length=hop_length, win_length=win_length, length=len(noisy))

# enhanced = librosa.istft(mag*pha,hop_length=160,win_length=320,length=fs)

# sf.write("./test.wav",enhanced,samplerate=16000)
'''
def test_torch(inputs):
    fft_len=512
    win_len=320
    len_hop=160
    inputs = torch.from_numpy(inputs.reshape(1,-1).astype(np.float32))
    window = torch.hann_window(win_len)
    spec = torch.stft(inputs, fft_len, len_hop, win_len, window, center=True, return_complex=False)
    print("stft out", spec.shape)
    out = torch.istft(spec, fft_len, len_hop, win_len, window, True, return_complex=False)
    return out
'''

sigal, fs = librosa.load(r'./data/train_noisy/p226_001_0.wav',sr=16000)
sigal = torch.from_numpy(sigal).unsqueeze(0)
fft_len=512
win_len=320
len_hop=160
window = torch.hann_window(win_len)
spec = torch.stft(sigal, fft_len, len_hop, win_len, window, center=True, return_complex=False).permute(0,3,2,1) # B,2,T,F
print("stft out", spec.shape)
spec = spec.permute(0,3,2,1)
out = torch.istft(spec, fft_len, len_hop, win_len, window, True, return_complex=False)
print("istft",out.shape)
sf.write("./test.wav",out.squeeze(0),samplerate=16000)

'''
real = spec[:, :, :, 0]  # 实部
imag = spec[:, :, :, 1]  # 虚部
mags = torch.abs(torch.sqrt(torch.pow(rea, 2) + torch.pow(imag, 2)))
phase = torch.atan2(imag.data, real.data)
'''

stft

import soundfile as sf
import torch


tt, fs = sf.read(r'./data/train_noisy/p226_001_0.wav')
# 第三种, 选择第三种
tt = torch.from_numpy(tt).unsqueeze(0)
# print(tt.shape)
feat_x = torch.stft(
    tt,
    n_fft=512,
    hop_length=160,
    win_length=320,
    window=torch.hann_window(320),
).permute(0, 3, 2, 1)
print(feat_x.shape)
feat_x_phase = torch.atan2(feat_x[:, -1, :, :], feat_x[:, 0, :, :])
feat_x_mag = (torch.norm(feat_x, dim=1)) ** 0.5

print(feat_x_mag)
print(feat_x_phase)
print(feat_x_mag.shape)
print(feat_x_phase.shape)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强大的RGG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值