我以前从未处理过音频信号,对信号处理知之甚少。不过,我需要使用matplotlib库中的pyplot.specgram函数来表示和音频信号。这是我如何做到的。
import matplotlib.pyplot as plt
import scipy.io.wavfile as wavfile
rate, frames = wavfile.read("song.wav")
plt.specgram(frames)
Run Code Online (Sandbox Code Playgroud)
当我查看我认为是频域和时域的x 轴和 y 轴时,我无法理解频率从0 到 1.0和时间从0 到 80k缩放的事实。它背后的直觉是什么,更重要的是,如何以人类友好的格式表示它,使频率为 0 到 100k,时间以秒为单位?
我的问题如下:
我拥有频谱图所需的所有值(scipy.fftpack.fft )。我想在 python 中创建一个 3D 频谱图。
在 MATLAB 中,这是一项非常简单的任务,而在 Python 中似乎要复杂得多。我尝试过 mayavi、3D 绘图 matplotlib,但我还没有设法做到这一点。
谢谢
我的代码:
import numpy as np
import pandas as pd
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.collections import PolyCollection
fs = 11240.
t = 10
time = np.arange(fs*t) / fs
frequency = 1000.
mysignal = np.sin(2.0 * np.pi * frequency * time)
nperseg = 2**14
noverlap = 2**13
f, …Run Code Online (Sandbox Code Playgroud) 我有一个从 0.20 ms 到 0.40 ms 的音调突发信号。从 0 到 0.20ms 和从 0.40ms 到 3.27ms 它为零。我做了 fft 显示大约 25 kHz 的频率内容。fft 点数为 32768,这也是时域信号的长度。
我正在尝试使用以下代码片段在 Matlab 中绘制频谱图
nfft = 32768;
dT = 1e-6;
fs = 1/dT;
window = hamming(nfft)
spectrogram(signal,window,[],nfft,fs)
Run Code Online (Sandbox Code Playgroud)
使用这个我得到了准确的频率描述,但时间轴是一个问题。
放大时域信号:
25 kHz 时的频谱图:
我想操作seewave音频频谱图,然后将其转换回.wav文件。一个简单的例子
library(tuneR)
library(seewave)
data(tico)
#generate spectrogram with phase information
spec_tico=spectro(tico,plot=FALSE,complex=TRUE,norm=FALSE,dB=NULL)
#manipulate spectrogram
spec_tico_new=dostuff(spec_tico)
#convert back into Wave object - but there is no function spectr2Wave!
tico_new=spectr2Wave(spec_tico_new,...)
Run Code Online (Sandbox Code Playgroud)
我spectr2Wave在seewave文档中找不到任何接近的内容。
你们知道如何在不深入研究wav文件规范并手动执行的情况下将其转换回来的方法吗?谢谢!
我使用matplotlib.pyplot.specgram和matplotlib.pyplot.pcolormesh来制作地震信号的频谱图.
背景信息 - 使用pcolormesh的原因是我需要在光谱图数据阵列上进行算术,然后重新绘制得到的频谱图(对于三分量地震图 - 东,北和垂直 - 我需要计算水平频谱幅度和用水平光谱划分垂直光谱.使用谱图阵列数据比使用单个振幅谱更容易
我发现算术后的谱图有意想不到的值.经过进一步调查后发现,与使用pyplot.pcolormesh制作的频谱图和pyplot.specgram方法返回的数据数据相比,使用pyplot.specgram方法制作的频谱图具有不同的值.两个图/数组都应该包含相同的值,我无法弄清楚它们为什么没有.
示例:的情节
plt.subplot(513)
PxN, freqsN, binsN, imN = plt.specgram(trN.data, NFFT = 20000, noverlap = 0, Fs = trN.stats.sampling_rate, detrend = 'mean', mode = 'magnitude')
plt.title('North')
plt.xlabel('Time [s]')
plt.ylabel('Frequency [Hz]')
plt.clim(0, 150)
plt.colorbar()
#np.savetxt('PxN.txt', PxN)
Run Code Online (Sandbox Code Playgroud)
看起来与情节不同
plt.subplot(514)
plt.pcolormesh(binsZ, freqsZ, PxN)
plt.clim(0,150)
plt.colorbar()
Run Code Online (Sandbox Code Playgroud)
即使"PxN"数据阵列(即每个段的频谱图数据值)由第一种方法产生并在第二种方法中重新使用.
有人知道为什么会这样吗?
PS我意识到我对NFFT的价值不是一个平方数,但在我编码的这个阶段它并不重要.
PPS我不知道"imN"数组(来自pyplot.specgram的第四个返回变量)是什么以及它用于什么......
我在使用声音的自定义文件路径在librosa中创建梅尔频谱图时遇到问题。
我正在遵循此文档:https : //librosa.github.io/librosa/generated/librosa.feature.melspectrogram.html
我看过这个堆栈溢出文章: 使用Librosa生成的频谱图看起来与Kaldi不一致?
但是,这些都没有帮助我解决问题。
import librosa
y, sr = librosa.load("path_to_my_wav_file")
librosa.feature.melspectrogram(y=y, sr=sr)
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
librosa.display.specshow(librosa.power_to_db(y,
ref=np.max), y_axis='mel', fmax=8000, x_axis='time')
plt.colorbar(format='%+2.0f dB')
plt.title('Mel spectrogram')
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何修复此代码,以使其正确显示并将mel-spectrogram保存为jpg文件吗?谢谢!
例如,我有一个带有语音的 wav 文件。
我可以使用 sox 创建漂亮的频谱图可视化:
wget https://google.github.io/tacotron/publications/tacotron2/demos/romance_gt.wav
sox romance_gt.wav -n spectrogram -o spectrogram.png
Run Code Online (Sandbox Code Playgroud)
我怎样才能在Python中重现这个频谱图?
这是使用scipy.signal.spectrogram的示例
input_file = 'temp/romance_gt.wav'
fs, x = wavfile.read(input_file)
print('fs', fs)
print('x.shape', x.shape)
f, t, Sxx = signal.spectrogram(x, fs)
print('f.shape', f.shape)
print('t.shape', t.shape)
print('Sxx.shape', Sxx.shape)
plt.pcolormesh(t, f, Sxx)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.savefig('spectrogram_scipy.png')
Run Code Online (Sandbox Code Playgroud)
正如您可能注意到的,我对 python 和声音处理非常陌生。我(希望)使用 python 以及 logfbank 和 mfcc 函数从波形文件中提取 FFT 数据。(logfbank 似乎提供了最有希望的数据,mfcc 输出对我来说看起来有点奇怪)。
在我的程序中,我想更改 logfbank/mfcc 数据,然后从中创建波形数据(并将它们写入文件中)。我确实没有找到任何有关从 FFT 数据创建波形数据的过程的信息。你们中有人知道如何解决这个问题吗?我将非常感激:)
到目前为止,这是我的代码:
from scipy.io import wavfile
import numpy as np
from python_speech_features import mfcc, logfbank
rate, signal = wavfile.read('orig.wav')
fbank = logfbank(signal, rate, nfilt=100, nfft=1400).T
mfcc = mfcc(signal, rate, numcep=13, nfilt=26, nfft=1103).T
#magic data processing of fbank or mfcc here
#creating wave data and writing it back to a .wav file here
Run Code Online (Sandbox Code Playgroud) 我正在尝试绘制 16000Hz 16 位 .wav 语音音频的波形图和频谱图。我已成功获得以下图:
但是,频谱图上的时间值不正确。我确信我的采样率在整个程序中是一致的(16000Hz),但我仍然无法获得频谱图的正确时间值。
下面是我的Python脚本:
import matplotlib.pyplot as plt
import librosa
import librosa.display
import numpy as np
y, sr = librosa.load('about_TTS_0792.wav', sr=16000)
print("Current audio sampling rate: ", sr)
print("Audio Duration:", librosa.get_duration(y=y, sr=sr))
D = librosa.stft(y, hop_length=64, win_length=256) # STFT of y
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
fig, ax = plt.subplots(nrows=2)
librosa.display.waveplot(y, sr=sr, ax=ax[0])
img = librosa.display.specshow(S_db, sr=sr, x_axis='s', y_axis='linear',ax=ax[1])
ax[1].set(title='Linear spectrogram')
fig.colorbar(img, ax=ax[1], format="%+2.f dB")
fig.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
此代码的输出:
Current audio sampling rate: 16000
Audio Duration: 0.792
Run Code Online (Sandbox Code Playgroud)
我不知道我错过了什么会导致 x …
我正在努力将我的代码从 python 转换为目标 c。在 matplotlib.mlab.specgram 函数中,我在 fft 之前看到了 3 个重要的函数:
result = stride_windows(x, NFFT, noverlap, axis=0)
result = detrend(result, detrend_func, axis=0)
result, windowVals = apply_window(result, window, axis=0,
return_window=True)
result = np.fft.fft(result, n=pad_to, axis=0)[:numFreqs, :]
Run Code Online (Sandbox Code Playgroud)
我试图调试以了解每个的目的。例如我有输入数组:
x = [1,2,3,4,5,6,7,8,9,10,11,12]
Run Code Online (Sandbox Code Playgroud)
在第一个函数 stride_windows 之后(这个是为了防止泄漏?),如果 NFFT = 4,noverlap = 2 那么:
x = [ [1,3,5,7,9],
[2,4,6,8,10],
[3,5,7,9,11],
[4,6,8,10,12]
]
Run Code Online (Sandbox Code Playgroud)
在 detrend 之后没有任何变化(我了解 fft 之前的 detrend)
在 apply_window 里面(我不明白这一步):
xshape = list(x.shape)
xshapetarg = xshape.pop(axis) // =4
windowVals = window(np.ones(xshapetarg, dtype=x.dtype))
//result of 4 elements …Run Code Online (Sandbox Code Playgroud)