将正弦波分解为分量频率

问题描述

我正在尝试使用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,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()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)