Почему следующий БПФ приводит к другому набору частот, чем тот, который используется для генерации? - PullRequest
0 голосов
/ 05 сентября 2018

Я создаю аудиофайл SingleTone.wav, используя следующую команду sox.

sox -n SingleTone.wav synth 10 sin 525

Затем я запускаю следующую программу, чтобы выполнить fft на сэмпле этого тона.

import matplotlib.pyplot as plt
from scipy.fftpack import fft, rfft
from scipy.io import wavfile
from sys import argv

# FFT sample count
N = 8192

# Sampling frequency
samples_per_second = 44100

# Frequency resolution
freq_resolution = samples_per_second / N

fs, data = wavfile.read(argv[1])
a = data.T
b=[(ele/2**8.)*2-1 for ele in a]
c = fft(b, N)
d = len(c)/2 - 1 
frequencies = [x*freq_resolution for x in xrange(d)]
print '\n'.join(",".join([str(f),str(x)]) for f, x in zip(frequencies, abs(c[:d])))
plt.plot(frequencies, abs(c[:d]),'r')
plt.show()

Выходной сигнал, который я получаю, представляет собой скачок частоты между 440 Гц и 455 Гц, а не 525 Hz, как я ожидал.

В чем причина несоответствия?

Правильные ответы могут указывать на неправильное понимание FFT, ошибку в коде или что-то неверное в настройке.

1 Ответ

0 голосов
/ 18 сентября 2018

Попробуйте: используйте частоту дискретизации из файла wav и, для удобства и меньшего количества ошибок, используйте список частот, предоставляемый библиотекой fft.

Вот код, указанный выше,

#!/usr/bin/python

import matplotlib.pyplot as plt
from scipy.fftpack import fft, rfft, fftfreq, rfftfreq
from scipy.io import wavfile
from sys import argv

samples_per_second, data = wavfile.read(argv[1])

# FFT sample count
N = 8192

a = data.T
b=[(ele/2**8.)*2-1 for ele in a]

c = fft(b, N)
d = len(c)/2 - 1 

frequencies = fftfreq(N,1./samples_per_second)

#print '\n'.join(",".join([str(f),str(x)]) for f, x in zip(frequencies[:d], abs(c[:d])))

plt.plot(frequencies[:d], abs(c[:d]),'r')
plt.show()
...