audio - 使用Julia在声音上使用fft

标签 audio julia fft

我在Julia中写了一些代码:

using FFTW
using Plots
using WAV, PlotlyJS

snd, sampFreq = wavread("input.wav")

N, _ = size(snd)
t = 0:1/(N-1):1;
s = snd[:,1]

y = fft(s)

y1 = copy(y)
for i = 1:N
    if abs(y1[i]) > 800
        y1[i] = 0
    end
end

s_new = real(ifft(y1))
wavwrite(s_new, "output1.wav", Fs = sampFreq)

y2 = copy(y)
for i = 1:N
    if abs(y2[i]) <  800
        y2[i] = 0
    end
end

s_new = real(ifft(y2))
wavwrite(s_new, "output2.wav", Fs = sampFreq)

sticks((abs.(y1)))
sticks!((abs.(y2)))

s1,k1 = wavread("output1.wav")
s2,k2 = wavread("output2.wav")

for i = 1:N
    s1[i] += s2[i]
end

wavwrite(s1, "output3.wav", Fs = sampFreq)

它是读取文件input.wav的代码,然后对声音进行fft,将其分为两个文件,其中output1的频率仅> 800,而output2的频率小于800。

在下一部分中,我将两个文件合并到output3中。我期望与输入类似,但是我得到的声音听起来很糟糕(我的意思是听起来像输入,但更安静并且嗡嗡声比预期的大)。

我的问题是,我在代码的哪一部分上放开了有关输入的大部分信息,这是一种改进它的方法,以使output3几乎像输入一样?

最佳答案

您似乎不明白fft(快速傅立叶变换)返回的内容。它返回一个振幅 vector ,而不是频率 vector 。 vector 的分量与正弦波的振幅相对应,该振幅的频率可以使用fftfreq()函数找到,但是一定要为fftfreq()函数提供第二个参数sampFreq变量。

然后,要分解声音,您需要根据fftfreq()告诉您与垃圾箱相对应的频率(fft()返回的 vector 中的 vector 位置)将不需要的 vector 分量清零。

通过使用ifft逆转过程,您仍然会看到声音质量的大幅下降,因为fft通过将信号分成频率维度的频段,基本上可以平均信号的一部分。

在进一步修复代码之前,我建议使用fft()上的教程-您可以在其中几个Google上搜索。

关于audio - 使用Julia在声音上使用fft,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082672/

相关文章:

python - FFT 中的矢量和 RMS 平均

c# - 在C#中从youtube视频中提取mp3音频文件

module - Julia:列出模块内的文档字符串

julia - 如何以与 Julia 中未嵌套变量相同的方式访问嵌套结构中的变量?

package - Julia 中的 "Unsatisfiable requirements detected for the package"

fft - 使用 fft 进行二阶导数

android - 在ViewPager和慢速应用程序中滑动后声音不会停止

ios - 如何在 iOS 上播放现场音频?

audio - gstreamer 多 channel 大于 8 个 channel

java - Android 中音频文件的 FFT