傅里叶变换音频加入噪声和去除噪声(python二维fft2,ifft2)

简介

标准快速傅立叶变换

fft (a) [, n, axis, norm] )

计算一维离散傅立叶变换。

ifft (a) [, n, axis, norm] )

计算一维逆离散傅立叶变换。

fft2 (a) [, s, axes, norm] )

计算二维离散傅里叶变换。

ifft2 (a) [, s, axes, norm] )

计算二维逆离散傅立叶变换。

fftn (a) [, s, axes, norm] )

计算n维离散傅立叶变换。

ifftn (a) [, s, axes, norm] )

计算N维逆离散傅立叶变换。

实数傅立叶变换

rfft (a) [, n, axis, norm] )

计算实际输入的一维离散傅立叶变换。

irfft (a) [, n, axis, norm] )

计算 rfft .

rfft2 (a) [, s, axes, norm] )

计算实数组的二维FFT。

irfft2 (a) [, s, axes, norm] )

计算 rfft2 .

rfftn (a) [, s, axes, norm] )

计算实际输入的N维离散傅立叶变换。

irfftn (a) [, s, axes, norm] )

计算 rfftn .

埃尔米特快速傅里叶变换

hfft (a) [, n, axis, norm] )

计算具有赫米特对称性的信号的FFT,即真实频谱。

ihfft (a) [, n, axis, norm] )

计算具有厄米特对称性的信号的逆FFT。

助手例程

fftfreq n(n) [, d] )

返回离散傅立叶变换采样频率。

rfftfreq n(n) [, d] )

返回离散傅立叶变换采样频率(用于rfft、irfft)。

fftshift (x) [, axes] )

将零频率分量移到频谱中心。

ifftshift (x) [, axes] )

逆 fftshift .

 本文主要对仙侠风音乐加入噪声,并去除噪声

资源文件名:spring.wav

资源完整路径:https://github.com/fengjun321/noise.git

核心代码:test3.py

若资源文件失效,可去百度下载别的wav格式音乐代替spring.wav

# 用于保存音频
import wave
#数学库
import numpy as np
import matplotlib.pyplot as plt

#中文支持和布局调整
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.rcParams['figure.figsize']=(15,8)

plt.subplots_adjust(left=None, bottom=None, right=None, top=None,
                wspace=0.5, hspace=0.5)

def saveAudio(filename,data,params):
    with wave.open(filename + '.wav', 'wb') as wavfile:
        print(params)
        wavfile.setparams(params)
        wavfile.writeframes(bytes(data))

def wavread(path):
    wavfile = wave.open(path, "rb")
    params = wavfile.getparams()
    print(params)

    framesra, frameswav = params[2], params[3]
    datawav = wavfile.readframes(frameswav)
    wavfile.close()
    datause = np.frombuffer(datawav, dtype=np.short)
    datause.shape = -1, 2
    datause = datause.T
    time = np.arange(0, frameswav) * (1.0 / framesra)
    return datause, time, params

path = r"spring.wav"
wavdata, wavtime, params = wavread(path)

noise=np.random.rand(len(wavdata[0]))

noise_music = wavdata.copy() + noise
saveAudio("加噪后_spring", noise_music, params)

transformed=np.fft.fft2(noise_music)

avg1 = np.max(abs(transformed[0][1:]))/10000
avg2 = np.max(abs(transformed[1][1:]))/10000
transformed[0][np.where(abs(transformed[0])<=avg1)]=0+0j
transformed[1][np.where(abs(transformed[1])<=avg2)]=0+0j

noise_music = np.fft.ifft2(transformed).astype(int) #astype(int)很重要,过滤掉浮点过小信号

plt.subplot(231)
plt.title("原音频时序")
plt.plot(wavdata[0][4000:4500])

plt.subplot(232)
plt.title("原音频频域")
plt.plot(np.fft.fft(wavdata[0][4000:4200]))

plt.subplot(233)
plt.title("噪声音频时序")
plt.plot(noise_music[0][4000:4500])

plt.subplot(234)
plt.title("噪声音频频域")
plt.plot(np.fft.fft(noise_music[0][4000:4200]))

plt.show()
saveAudio("还原后_spring", noise_music, params)

效果图对比

不足之处,没在图片明显看出噪声,因为噪声振幅小,不易于观察。读者可直接运行代码,生成对应音频文件,音效播放对比明显。 

猜你喜欢

转载自blog.csdn.net/u013177138/article/details/124231615
今日推荐