Python 3.x 将正弦波分解为频率分量

Python 3.x 将正弦波分解为频率分量,python-3.x,scipy,fft,Python 3.x,Scipy,Fft,我试图使用FFT来清楚地识别构造信号中的分量频率。我遇到的困难是用正确的轴清晰地绘制信号,以识别组件。我认为这可以做到,如果采样率是已知的,但我无法计算出来 import numpy as np import matplotlib.pyplot as plt import simpleaudio as sa # calculate note frequencies A_freq = 440 Csh_freq = A_freq * 2 ** (4 / 12) E_freq = A_freq *

我试图使用FFT来清楚地识别构造信号中的分量频率。我遇到的困难是用正确的轴清晰地绘制信号,以识别组件。我认为这可以做到,如果采样率是已知的,但我无法计算出来

import numpy as np
import matplotlib.pyplot as plt
import simpleaudio as sa

# calculate note frequencies
A_freq = 440
Csh_freq = A_freq * 2 ** (4 / 12)
E_freq = A_freq * 2 ** (7 / 12)

# get timesteps for each sample, T is note duration in seconds
sample_rate = 44100
T = 0.5
samples = int(T * sample_rate)
t = np.linspace(start=0, stop=T, num=samples, retstep=False)

# generate sine wave notes
A_note = np.sin(A_freq * t * 2 * np.pi)
Csh_note = np.sin(Csh_freq * t * 2 * np.pi)
E_note = np.sin(E_freq * t * 2 * np.pi)

# mix audio together
#audio = np.zeros((44100, 2))
audio = np.zeros((44100, 1))
n = len(t)  #22050 = 44100 / 2
offset = 0
audio[0 + offset: n + offset, 0] += A_note
#audio[0 + offset: n + offset, 1] += 0.125 * A_note
offset = 5500
audio[0 + offset: n + offset, 0] += 0.5 * Csh_note
#audio[0 + offset: n + offset, 1] += 0.5 * Csh_note
offset = 11000
audio[0 + offset: n + offset, 0] += 0.125 * E_note
#audio[0 + offset: n + offset, 1] += E_note


# normalize to 16-bit range
audio *= 32767 / np.max(np.abs(audio))
# convert to 16-bit data
audio = audio.astype(np.int16)

# start playback
play_obj = sa.play_buffer(audio, 2, 2, sample_rate)

# wait for playback to finish before exiting
play_obj.wait_done()

# This doesn't work
fft = np.abs(np.fft.fftshift(np.fft.fft(Csh_note[:100], 100)))
freqs = np.arange(start = -100/2,stop = 100/2) * sample_rate

# Plotting waveform
plt.plot(freqs, fft)
plt.show()