import wave
import struct
import numpy as np
if name == '__main__':
data_size = 40000
fname = "test.wav"
frate = 11025.0
wav_file = wave.open(fname, 'r')
data = wav_file.readframes(data_size)
wav_file.close()
data = struct.unpack('{n}h'.format(n=data_size), data)
data = np.array(data)
w = np.fft.fft(data)
freqs = np.fft.fftfreq(len(w))
print(freqs.min(), freqs.max())
# (-0.5, 0.499975)
# Find the peak in the coefficients
idx = np.argmax(np.abs(w))
freq = freqs[idx]
freq_in_hertz = abs(freq * frate)
print(freq_in_hertz)
# 439.8975
这个是对于单个data_size,frate已知的情况,真实情况是未知,且有多个频率的信号。求解。。。
对于单个频率的波形,取频谱的峰值,np.argmax()可以取到下标值,根据freq=下标*N/fs,获得频率值, 对于含有多个频率的波形,我是做一个区分,判断频谱中
振幅大于某个数,就为信号,小于某个数就为噪声。这样不准确,最好用信噪比判断,然后同样获取下标,获得频率值,相应还能得到幅度。
看到傅立叶我就晕了。楼主帮顶一个!
你这个是已知频率和幅度数组,通过傅里叶变换得到频谱的程序吗?
我们需要一个已知频率数组和幅度数组,用STM32编程实现用示波器显示频谱,但是要自己写算法的程序,不知道你能帮我的忙?感激不尽
楼主还在么?
后人来请教啊,有没有办法通过一个示波器的波形图,写一段python代码,直接给出比如10MHz~10GHz的频域结果
我知道有软件可以的,想学习自己怎么写这个代码。
本人会基本的python代码,傅里叶变换不太懂,求直接给代码。