Использование FFT на звук с использованием Юлия - PullRequest
2 голосов
/ 10 мая 2019

У меня есть какой-то код в Джулии, который я только что написал:

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. </p>

В следующей части я объединю два файла в output3.Я ожидал чего-то похожего на ввод, но то, что я получаю, звучит ужасно (я имею в виду, что это звучит как ввод, но он тише и с гулом больше, чем ожидалось).

У меня вопрос, на какой части кода я теряюбольшая часть информации о входных данных и способ ее улучшить, получить в качестве выходных данных3 что-то почти похожее на входные данные?

1 Ответ

1 голос
/ 10 мая 2019

Вы, похоже, не понимаете, что возвращает fft (быстрое преобразование Фурье). Возвращает вектор амплитуд, а не частот. Компоненты вектора соответствуют амплитуде синусоидальной волны на частоте, которую можно найти с помощью функции fftfreq (), но обязательно предоставьте функцию fftfreq () со вторым аргументом, вашей переменной sampFreq.

Для декомпозиции звука вам нужно обнулить ненужные компоненты вектора, основываясь на том, что fftfreq () сообщает вам частоты, соответствующие ячейкам (положения вектора в векторе, возвращаемом функцией fft (). * 1003) *

Вы по-прежнему увидите значительное снижение качества звука при обращении процесса с помощью ifft, потому что fft будет в основном усреднять части сигнала, разбивая его на ячейки измерения частоты.

Я предлагаю учебник по fft (), прежде чем вы исправите свой код - вы можете погуглить несколько из них.

...