Dzień dobry. Napisałem skrypt w języku python, który ładuje plik MP3 muzyki i oblicza transformatę Fouriera w celu uzyskania widma częstotliwości dzięki czemu mogę wyłuskać pojedyncze sygnały. Idea kodu jest taka, że:
1. Ładuje plik dźwięku muzyki MP3 i dekompresuje do WAV
2. Wyciągam z pliku WAV dane o częstotliwości próbkowania i dane o fali dźwiękowej (muzyka jest stereo, posiada dwa kanały identyczne co do zawartości, więc bierzemy jeden)
3. Używamy FFT, wyliczamy częstotliwość do skali i rysuje wykres.
Teraz tak, testowałem dla dźwięku o częstotliwości 100Hz i 1KHz i na wykresie pokazuje, że zgadza się, na tej częstotliwości jest czysty sygnał. Ale chciałbym, żeby ktoś sprawdził czy to dobrze liczy i dobrze rysuje wykres. Skrypt będę potem wykorzystywać do wizualizacji muzyki.
Czy to co napisałem jest prawidłowe, czy coś muszę poprawić ?
Kod:
#Moduły pydub, scipy i matplotlib
import pydub
from scipy.io import wavfile
from scipy.fftpack import fft
from scipy.fftpack import fftfreq
import matplotlib.pyplot as plt
#Ścieżki do pliku MP3 i do zapisu pliku WAV
FilepathMP3 = '/home/piter/Dokumenty/studia/[S7]_Praca_inżynierska/Testowanie FFT/Test3.mp3'
FilepathWAV = '/home/piter/Dokumenty/studia/[S7]_Praca_inżynierska/Testowanie FFT/Test3.wav'
#Załadowanie pliku MP3
FileMP3 = pydub.AudioSegment.from_mp3(FilepathMP3)
#Dekompresja pliku MP3 do pliku WAV
FileMP3.export(FilepathWAV,format="wav")
#Odczytanie danych: Częstotliwość próbkowania, dane o fali dźwiękowej
Rate,AudData = wavfile.read(FilepathWAV)
#Stereo: Dwa kanały (Lewy i Prawy). Bierzemy dane tylko z jednego, bo są identyczne
channel1 = AudData[:,0]
#Wyliczenie dyskretnej Transformaty Fouriera
FFT = abs(fft(channel1))
#Przygotowanie skali częstotliwości
freqs = fftfreq(len(FFT),(1.0/Rate))
print(freqs)
#Narysowanie wykresu
plt.plot(freqs[range(len(FFT)//2)],FFT[range(len(FFT)//2)])
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
plt.savefig('Wykres_testowy.png')
plt.show()