傅里叶变换FFT和IFFT在音频去噪的应用

19 篇文章 4 订阅
6 篇文章 0 订阅

FFT

FFT是DFT的快速算法,可以将一个信号从时域变换到频域。

有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。

另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。

去掉FFT变换时,频谱中的直流分量

直流分量:理论中,输入=0时,输出=0,没有什么直流分量的;

直流分量是输入信号带入的。

在模拟部分的电路中,元件输出会有直流漂移,即输出应该为零时,实际上是一个直流电压。

通常数字信号去直流直接减去均值即可。

IFFT

IFFT的计算原理是将频域(频域是复数)数据进行取共轭复数(虚部取反),然后进行FFT变换,这样便将频域信号转换到时域。
 

代码模块介绍

用到的库

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

生成余弦波和噪声

x=np.arange(0,5,.00005)
y=np.cos(2000*np.pi*x)
noise=np.random.rand(len(x))

保存音频

def saveAudio(filename,data):
    with wave.open(filename + '.wav', 'wb') as wavfile:
        wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
        wavfile.writeframes(data)

加噪声

y=y+noise

saveAudio("加噪音",y)

 离散傅里叶变换,得到一组可以表示各次谐波的幅值与相位的复数(0点为直流分量)

ft_y=np.fft.fft(y)

傅里叶反变换,并保存音频

saveAudio("去噪音",np.fft.ifft(ft_y))

完整代码:

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

def saveAudio(filename,data):
    with wave.open(filename + '.wav', 'wb') as wavfile:
        wavfile.setparams((1, 2, 16000, 0, 'NONE', 'NONE'))
        wavfile.writeframes(data)

#中文支持和布局调整
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)


#生成余弦波和噪音
x=np.arange(0,5,.00005)
y=np.cos(2000*np.pi*x)
noise=np.random.rand(len(x))
print("noise value:", noise)

#保存原音频
saveAudio("原音频",y)

#保存原音频
b = y.copy()
print("yuan yin pin", b)

#加噪音
y=y+noise
saveAudio("加噪音",y)

#离散傅里叶变换,得到一组可以表示各次谐波的幅值与相位的复数(0点为直流分量)
ft_y=np.fft.fft(y)
n = len(y) 
print("len of y:" + str(n))
print("len of fft y:" + str(len(ft_y)))
print("ft_y value", ft_y)

#取得最大的振幅的二分之一
avg=np.max(abs(ft_y[1:]))/2


plt.subplot(233)
plt.title("降噪前的频率振幅谱")
plt.plot(abs(ft_y[0:]))

#干掉掉直流分量和小于最大振幅二分之一的信号
#ft_y[0]=0+0j
ft_y[np.where(abs(ft_y)<=avg)]=0+0j
print("qqq:",np.fft.ifft(ft_y))
saveAudio("去噪音",np.fft.ifft(ft_y))

plt.subplot(231)
plt.title("原音频")
plt.plot(b[0:200])

plt.subplot(232)
plt.title("加了噪音的原音频")
plt.plot(y[0:200])

plt.subplot(234)
plt.plot(abs(ft_y[0:]))
plt.title("降噪后的频率振幅谱")
plt.xlabel("frequency")
plt.ylabel("amplitude")
plt.subplot(235)
plt.title("降噪后的音频")
plt.plot(np.fft.ifft(ft_y)[0:200])


plt.subplot(236)
plt.title("原音频频谱")
plt.plot(abs(np.fft.fft(b))[0:200])

plt.show()

降噪前后波形对比图

  • 2
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
小波变换和傅立叶变换在信号去噪方面有着不同的优缺点。下面给出Matlab对应的代码实现。 首先,我们生成一个包含噪声的信号: ```matlab t = linspace(0, 1, 1000); x = sin(2*pi*10*t) + sin(2*pi*20*t) + sin(2*pi*30*t) + 0.5*randn(size(t)); ``` 其中,前三项是正弦信号,最后一项是高斯噪声。 使用傅立叶变换进行去噪: ```matlab X = fft(x); f = linspace(0, 1, length(x)); F = (abs(f-0.1)<0.05) | (abs(f-0.2)<0.05) | (abs(f-0.3)<0.05); X(F) = 0; y = ifft(X); ``` 上述代码中,在频域上将10Hz、20Hz和30Hz的分量去除,然后再通过逆傅立叶变换将信号转回时域。此方法适用于对稳态信号进行去噪。 使用小波变换进行去噪: ```matlab wname = 'db4'; [C, L] = wavedec(x, 4, wname); thr = wthrmngr('dw2ddenoLVL', 'penalhi', C, L, 3); xd = wdencmp('gbl', C, L, wname, 4, thr, 'h'); ``` 上述代码中,使用Daubechies-4小波对信号进行分解,选取第四层小波系数进行阈值处理,使用硬阈值法将小于一定阈值的系数置为0,再进行重构。此方法适用于对非稳态信号进行去噪。 完整的Matlab代码如下: ```matlab % 生成包含噪声的信号 t = linspace(0, 1, 1000); x = sin(2*pi*10*t) + sin(2*pi*20*t) + sin(2*pi*30*t) + 0.5*randn(size(t)); % 傅立叶变换去噪 X = fft(x); f = linspace(0, 1, length(x)); F = (abs(f-0.1)<0.05) | (abs(f-0.2)<0.05) | (abs(f-0.3)<0.05); X(F) = 0; y1 = ifft(X); % 小波变换去噪 wname = 'db4'; [C, L] = wavedec(x, 4, wname); thr = wthrmngr('dw2ddenoLVL', 'penalhi', C, L, 3); y2 = wdencmp('gbl', C, L, wname, 4, thr, 'h'); % 绘制结果 figure; subplot(3,1,1); plot(t, x); title('Original Signal'); subplot(3,1,2); plot(t, y1); title('Fourier Transform Denoised Signal'); subplot(3,1,3); plot(t, y2); title('Wavelet Transform Denoised Signal'); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值