Быстрое преобразование Фурье (FFT) NumPy не работает на синусоиде, генерируемой в Audacity - PullRequest
2 голосов
/ 03 мая 2019

Я пытаюсь использовать библиотеку NumPy для Python, чтобы провести некоторый частотный анализ.У меня есть два файла .wav, которые содержат синусоидальный сигнал 440 Гц.Один из них я генерировал с помощью функции синуса NumPy, а другой - в Audacity.БПФ работает на Python-генерируемом, но ничего не делает на Audacity.

Вот ссылки на два файла:

нерабочий файл: 440_audacity.wav

Рабочий файл: 440_gen.wav

Этот код я использую для преобразования Фурье:

import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as wave

infile = "440_gen.wav"
rate, data = wave.read(infile)

data = np.array(data)

data_fft = np.fft.fft(data)
frequencies = np.abs(data_fft)

plt.subplot(2,1,1)
plt.plot(data[:800])
plt.title("Original wave: " + infile)

plt.subplot(2,1,2)
plt.plot(frequencies)
plt.title("Fourier transform results")

plt.xlim(0, 1000)

plt.tight_layout()

plt.show()

У меня есть два 16-битных PCM .wav файла, один из Audacity, а другой, созданный с помощью функции синуса NumPy.Генерируемый NumPy дает следующий (правильный) результат со всплеском на частоте 440 Гц: FFT on the numpy generated file

Тот, который я создал с Audacity, хотя форма волны выглядит идентичной, не даетлюбой результат преобразования Фурье: FFT on the audacity generated file

Я признаю, что я в недоумении.Два файла должны фактически содержать одинаковые данные.Они закодированы одинаково, и формы сигналов на верхнем графике выглядят одинаково.

Вот код, используемый для создания рабочего файла:

import numpy as np
import wave
import struct
import matplotlib.pyplot as plt
from operator import add

freq_one = 440.0
num_samples = 44100
sample_rate = 44100.0
amplitude = 12800

file = "440_gen.wav"

s1 = [np.sin(2 * np.pi * freq_one * x/sample_rate) * amplitude for x in range(num_samples)]

sine_one = np.array(s1)

nframes = num_samples
comptype = "NONE"
compname="not compressed"
nchannels = 1
sampwidth = 2

wav_file = wave.open(file, 'w')
wav_file.setparams((nchannels, sampwidth, int(sample_rate), nframes, comptype, compname))

for s in sine_one:
    wav_file.writeframes(struct.pack('h', int(s)))

1 Ответ

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

Следующее сработало для меня и подготовило графики, как и ожидалось:

import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as wave

infile = "440_gen.wav"
rate, data = wave.read(infile)

data = np.array(data)

# Use first 44100 datapoints in transform
data_fft = np.fft.fft(data[:44100])
frequencies = np.abs(data_fft)

plt.subplot(2,1,1)
plt.plot(data[:800])
plt.title("Original wave: " + infile)

plt.subplot(2,1,2)
plt.plot(frequencies)
plt.title("Fourier transform results")

plt.xlim(0, 1000)

plt.tight_layout()

plt.show()

enter image description here

enter image description here

...