请求验证萨克斯与单簧管声波离散傅里叶变换绘图正确性
声波离散傅里叶变换(DFT)绘图正确性确认
我正在对萨克斯和单簧管的声波文件执行离散傅里叶变换(DFT),但生成的变换绘图与预期不符——原本预期FFT频谱会更分散,实际结果却集中在很小的区域内。我已确认使用了正确的rfft函数,采样率为44100Hz,时间步长tau设置为1/44100或时间数组的首个非零点,代码逻辑看似无误,但仍对绘图结果存疑,希望确认这些绘图是否正确。
相关文件
- 萨克斯声波文件(saxophone.txt)
- 单簧管声波文件(clarinet.txt)
绘图及对应代码
绘图1(由Part B代码生成)

Part B代码
import numpy as np import matplotlib.pyplot as plt from numpy import cos, sqrt, exp, sin, pi, array, real, imag from mpl_toolkits.mplot3d import Axes3D # import 3D axes from matplotlib import cm from scipy.integrate import odeint from scipy.fft import fft, ifft, rfft, dct, dst, idct, irfft sax=np.loadtxt('saxophone.txt') clar=np.loadtxt('clarinet.txt') FT1=rfft(sax) FT2=rfft(clar) tsax=np.linspace(0,len(FT1)/44100,len(FT1)) tclar=np.linspace(0,len(FT2)/44100,len(FT2)) plt.plot(tsax,real(FT1)) plt.xlabel('time (s)') plt.title('Saxophone Soundwave Discrete Fourier Transform') plt.figure() plt.plot(tclar,real(FT2)) plt.xlabel('time (s)') plt.title('Clarinet Soundwave Discrete Fourier Transform') plt.show()
绘图2(由Part A & C代码生成)

绘图3(由Part A & C代码生成)

Part A & C代码
import numpy as np import matplotlib.pyplot as plt from numpy import cos, sqrt, exp, sin, pi, array, real, imag from mpl_toolkits.mplot3d import Axes3D # import 3D axes from matplotlib import cm from scipy.integrate import odeint from scipy.fft import fft, ifft, rfft, dct, dst, idct, irfft sax=np.loadtxt('saxophone.txt') clar=np.loadtxt('clarinet.txt') plt.figure(figsize=(12, 12)) plt.subplots_adjust(hspace=.25) plt.subplots_adjust(wspace=1) FT1=rfft(sax) FT2=rfft(clar) N=len(FT1) tsax=np.linspace(0,len(FT1)/44100,len(FT1)) tclar=np.linspace(0,len(FT2)/44100,len(FT2)) tau=tsax[1] freq=array([k/(2*N*tau) for k in range(N)]) tsax=np.linspace(0,len(sax)/44100,len(sax)) tclar=np.linspace(0,len(clar)/44100,len(clar)) plt.subplot(221) plt.plot(tsax, sax) plt.xlabel('time (s)') plt.title('Saxophone Soundwave') plt.subplot(223) plt.plot(tclar, clar) plt.xlabel('time (s)') plt.title('Clarinet Soundwave') plt.subplot(222) plt.plot(freq/1000, abs(real(FT1))) plt.xlabel('Frequency (kHz)') plt.title('Saxophone Soundwave Discrete Fourier Transform Coefficients vs Frequency') plt.subplot(224) plt.plot(freq/1000, abs(real(FT2))) plt.xlabel('Frequency (kHz)') plt.title('Clarinet Soundwave Discrete Fourier Transform Coefficients vs Frequency') plt.show()
内容的提问来源于stack exchange,提问作者Giau Diep
相关产品推荐
相关产品推荐

