如何在 python3 中减小 matplotlib 频谱图的比例
How to decrease the scale of a matplotlib spectrogram in python3
我正在分析 .wav 文件的频谱图。但是在让代码最终运行之后,我 运行 遇到了一个小问题。在保存了 700 多个 .wav 文件的频谱图后,我意识到它们看起来基本上都一样!!!这不是因为它们是同一个音频文件,而是因为我不知道如何将情节的比例变小(这样我才能分辨出差异)。
我已经尝试通过查看这个 Whosebug post 来解决这个问题
Changing plot scale by a factor in matplotlib
我将在下面显示两个不同 .wav 文件的图表
这是 .wav #1
这是 .wav #2
信不信由你,这是两个不同的 .wav 文件,但它们看起来非常相似。如果规模如此之大,计算机尤其无法分辨出这两个 .wav 文件中的差异。
我的代码如下
def individualWavToSpectrogram(myAudio, fileNameToSaveTo):
print(myAudio)
#Read file and get sampling freq [ usually 44100 Hz ] and sound object
samplingFreq, mySound = wavfile.read(myAudio)
#Check if wave file is 16bit or 32 bit. 24bit is not supported
mySoundDataType = mySound.dtype
#We can convert our sound array to floating point values ranging from -1 to 1 as follows
mySound = mySound / (2.**15)
#Check sample points and sound channel for duel channel(5060, 2) or (5060, ) for mono channel
mySoundShape = mySound.shape
samplePoints = float(mySound.shape[0])
#Get duration of sound file
signalDuration = mySound.shape[0] / samplingFreq
#If two channels, then select only one channel
#mySoundOneChannel = mySound[:,0]
#if one channel then index like a 1d array, if 2 channel index into 2 dimensional array
if len(mySound.shape) > 1:
mySoundOneChannel = mySound[:,0]
else:
mySoundOneChannel = mySound
#Plotting the tone
# We can represent sound by plotting the pressure values against time axis.
#Create an array of sample point in one dimension
timeArray = numpy.arange(0, samplePoints, 1)
#
timeArray = timeArray / samplingFreq
#Scale to milliSeconds
timeArray = timeArray * 1000
plt.rcParams['agg.path.chunksize'] = 100000
#Plot the tone
plt.plot(timeArray, mySoundOneChannel, color='Black')
#plt.xlabel('Time (ms)')
#plt.ylabel('Amplitude')
print("trying to save")
plt.savefig('/Users/BillyBobJoe/Desktop/' + fileNameToSaveTo + '.jpg')
print("saved")
#plt.show()
#plt.close()
如何修改此代码以提高绘图的灵敏度,从而使两个 .wav 文件之间的差异更加明显?
谢谢!
[更新]
我试过使用
plt.xlim((0, 16000))
但这只是在图表的右侧添加了空格
喜欢
我需要一种方法来更改每个单元的比例。这样当我将 x 轴从 0 - 16000
更改时,图表就会被填满
如果问题是:如何限制x轴上的刻度,比如说0到1000之间,你可以这样做:
plt.xlim((0, 1000))
我正在分析 .wav 文件的频谱图。但是在让代码最终运行之后,我 运行 遇到了一个小问题。在保存了 700 多个 .wav 文件的频谱图后,我意识到它们看起来基本上都一样!!!这不是因为它们是同一个音频文件,而是因为我不知道如何将情节的比例变小(这样我才能分辨出差异)。
我已经尝试通过查看这个 Whosebug post 来解决这个问题 Changing plot scale by a factor in matplotlib
我将在下面显示两个不同 .wav 文件的图表
这是 .wav #1
这是 .wav #2
信不信由你,这是两个不同的 .wav 文件,但它们看起来非常相似。如果规模如此之大,计算机尤其无法分辨出这两个 .wav 文件中的差异。
我的代码如下
def individualWavToSpectrogram(myAudio, fileNameToSaveTo):
print(myAudio)
#Read file and get sampling freq [ usually 44100 Hz ] and sound object
samplingFreq, mySound = wavfile.read(myAudio)
#Check if wave file is 16bit or 32 bit. 24bit is not supported
mySoundDataType = mySound.dtype
#We can convert our sound array to floating point values ranging from -1 to 1 as follows
mySound = mySound / (2.**15)
#Check sample points and sound channel for duel channel(5060, 2) or (5060, ) for mono channel
mySoundShape = mySound.shape
samplePoints = float(mySound.shape[0])
#Get duration of sound file
signalDuration = mySound.shape[0] / samplingFreq
#If two channels, then select only one channel
#mySoundOneChannel = mySound[:,0]
#if one channel then index like a 1d array, if 2 channel index into 2 dimensional array
if len(mySound.shape) > 1:
mySoundOneChannel = mySound[:,0]
else:
mySoundOneChannel = mySound
#Plotting the tone
# We can represent sound by plotting the pressure values against time axis.
#Create an array of sample point in one dimension
timeArray = numpy.arange(0, samplePoints, 1)
#
timeArray = timeArray / samplingFreq
#Scale to milliSeconds
timeArray = timeArray * 1000
plt.rcParams['agg.path.chunksize'] = 100000
#Plot the tone
plt.plot(timeArray, mySoundOneChannel, color='Black')
#plt.xlabel('Time (ms)')
#plt.ylabel('Amplitude')
print("trying to save")
plt.savefig('/Users/BillyBobJoe/Desktop/' + fileNameToSaveTo + '.jpg')
print("saved")
#plt.show()
#plt.close()
如何修改此代码以提高绘图的灵敏度,从而使两个 .wav 文件之间的差异更加明显?
谢谢!
[更新]
我试过使用
plt.xlim((0, 16000))
但这只是在图表的右侧添加了空格
喜欢
我需要一种方法来更改每个单元的比例。这样当我将 x 轴从 0 - 16000
更改时,图表就会被填满如果问题是:如何限制x轴上的刻度,比如说0到1000之间,你可以这样做:
plt.xlim((0, 1000))