我试图绘制我的时域信号的谱图:
N=5000;
phi = (rand(1,N)-0.5)*pi;
a = tan((0.5.*phi));
i = 2.*a./(1-a.^2);
plot(i);
spectrogram(i,100,1,100,1e3);
Run Code Online (Sandbox Code Playgroud)
问题是我不明白参数和应该给出的值.我正在使用这些值,我参考了MATLAB的在线文档spectrogram.我是MATLAB的新手,我只是没有理解.任何帮助将不胜感激!
我有一个采样率为16e3的信号,其频率范围为125到1000 Hz.因此,如果我绘制一个规格,我会得到一个非常小的颜色范围,因为所有未使用的频率.
香港专业教育学院试图通过设置斧头限制修复它,但这不起作用.
有没有办法切断未使用的频率或用NaN替换它们?
将数据重新采样到2e3将不起作用,因为仍有一些未使用的频率低于125 Hz.
谢谢你的帮助.
我正在尝试将色条添加到光谱图中.我已经尝试了我在网上找到的每一个例子和问题线程,但没有人解决过这个问题
请注意,'spl1'(数据拼接1)是来自ObsPy的跟踪.
我的代码是:
fig = plt.figure()
ax1 = fig.add_axes([0.1, 0.75, 0.7, 0.2]) #[left bottom width height]
ax2 = fig.add_axes([0.1, 0.1, 0.7, 0.60], sharex=ax1)
ax3 = fig.add_axes([0.83, 0.1, 0.03, 0.6])
t = np.arange(spl1[0].stats.npts) / spl1[0].stats.sampling_rate
ax1.plot(t, spl1[0].data, 'k')
ax,spec = spectrogram(spl1[0].data,spl1[0].stats.sampling_rate, show=False, axes=ax2)
ax2.set_ylim(0.1, 15)
fig.colorbar(spec, cax=ax3)
Run Code Online (Sandbox Code Playgroud)
它出现了错误:
Traceback (most recent call last):
File "<ipython-input-18-61226ccd2d85>", line 14, in <module>
ax,spec = spectrogram(spl1[0].data,spl1[0].stats.sampling_rate, show=False, axes=ax2)
TypeError: 'Axes' object is not iterable
Run Code Online (Sandbox Code Playgroud)
迄今为止的最佳结果:
用以下代码替换上面的最后3行:
ax = spectrogram(spl1[0].data,spl1[0].stats.sampling_rate, show=False, axes=ax2)
ax2.set_ylim(0.1, 15)
fig.colorbar(ax,cax=ax3)
Run Code Online (Sandbox Code Playgroud)
产生这个: …
很多文章都在使用 CNN 来提取音频特征。输入数据是具有时间和频率两个维度的频谱图。
创建音频频谱图时,您需要指定两个维度的确切大小。但它们通常不是固定的。可以通过窗口大小来指定频率维度的大小,但是时域呢?音频样本的长度不同,但CNNs的输入数据的大小应该是固定的。
在我的数据集中,音频长度范围从 1s 到 8s。填充或切割总是对结果影响太大。
所以我想更多地了解这种方法。
speech-recognition signal-processing spectrogram conv-neural-network
我是 python 编程的菜鸟,但在尝试从 RAVDESS 数据集 wav 文件绘制频谱图时,我一直在与这些错误作斗争。这是代码;
`for file in range(0 , len(listOfFiles) , 1):
windows_size = 20
sample_rate , samples = wavfile.read(listOfFiles[file])
nperseg = int(round(20 * sample_rate / 1e3))
frequencies , times, spectrogram = signal.spectrogram(samples, sample_rate)
plt.pcolormesh(times, frequencies, spectrogram)
plt.imshow(spectrogram)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()`
Run Code Online (Sandbox Code Playgroud)
这是错误
<ipython-input-16-dc119f345487>:14: WavFileWarning: Chunk (non-data) not understood, skipping it.
sample_rate , samples = wavfile.read(listOfFiles[file])
<ipython-input-16-dc119f345487>:14: WavFileWarning: Incomplete chunk ID: b'\x00', ignoring it.
sample_rate , samples = wavfile.read(listOfFiles[file])
<ipython-input-16-dc119f345487>:17: MatplotlibDeprecationWarning: shading='flat' when X and Y …Run Code Online (Sandbox Code Playgroud) 我不知道怎么做这个,我得到了一个例子,谱图,但这是2D.
我这里有代码生成混合频率,我可以在fft中选择这些,我怎样才能在频谱图中看到这些?我很欣赏我的例子中的频率不随时间而变化; 这是否意味着我会在谱图上看到一条直线?
我的代码和输出图像:
# create a wave with 1Mhz and 0.5Mhz frequencies
dt = 2e-9
t = np.arange(0, 10e-6, dt)
y = np.cos(2 * pi * 1e6 * t) + (np.cos(2 * pi * 2e6 *t) * np.cos(2 * pi * 2e6 * t))
y *= np.hanning(len(y))
yy = np.concatenate((y, ([0] * 10 * len(y))))
# FFT of this
Fs = 1 / dt # sampling rate, Fs = 500MHz = 1/2ns
n = len(yy) # length …Run Code Online (Sandbox Code Playgroud) 以下代码使用scipy.signal.spectrogram或生成频谱图matplotlib.pyplot.specgram。
specgram但是,该功能的色彩对比度相当低。有办法增加吗?
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
# Generate data
fs = 10e3
N = 5e4
amp = 4 * np.sqrt(2)
noise_power = 0.01 * fs / 2
time = np.arange(N) / float(fs)
mod = 800*np.cos(2*np.pi*0.2*time)
carrier = amp * np.sin(2*np.pi*time + mod)
noise = np.random.normal(scale=np.sqrt(noise_power), size=time.shape)
noise *= np.exp(-time/5)
x = carrier + noise
Run Code Online (Sandbox Code Playgroud)
使用matplotlib.pyplot.specgram将产生以下结果:
Pxx, freqs, bins, im = plt.specgram(x, NFFT=1028, Fs=fs)
x1, x2, …Run Code Online (Sandbox Code Playgroud) 当我通过使用以下代码使用matplotlib中的plt.specgram时,生成的频谱图是正确的
import matplotlib.pyplot as plt
from scipy import signal
from scipy.io import wavfile
import numpy as np
sample_rate, samples = wavfile.read('.\\Wav\\test.wav')
Pxx, freqs, bins, im = plt.specgram(samples[:,1], NFFT=1024, Fs=44100, noverlap=900)
Run Code Online (Sandbox Code Playgroud)
但是,如果我通过使用scipy页面中给出的示例代码和以下代码来生成频谱图,则会得到以下内容:
import matplotlib.pyplot as plt
from scipy import signal
from scipy.io import wavfile
import numpy as np
sample_rate, samples = wavfile.read('.\\Wav\\test.wav')
frequencies, times, spectrogram = signal.spectrogram(samples[:,1],sample_rate,nfft=1024,noverlap=900, nperseg=1024)
plt.pcolormesh(times, frequencies, spectrogram)
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
Run Code Online (Sandbox Code Playgroud)
要调试这是怎么回事,我尝试使用Pxx,freqs,bins,通过第一种方法生成的,然后使用第二种方法绘制出来的数据:
plt.pcolormesh(bins, freqs, Pxx)
plt.ylabel('Frequency [Hz]') …Run Code Online (Sandbox Code Playgroud) 我正在浏览这两个 librosa 文档:melspectrogram和stft。
我正在研究可变长度的音频数据集,但我不太了解形状。例如:
(waveform, sample_rate) = librosa.load('audio_file')
spectrogram = librosa.feature.melspectrogram(y=waveform, sr=sample_rate)
dur = librosa.get_duration(waveform)
spectrogram = torch.from_numpy(spectrogram)
print(spectrogram.shape)
print(sample_rate)
print(dur)
Run Code Online (Sandbox Code Playgroud)
输出:
torch.Size([128, 150])
22050
3.48
Run Code Online (Sandbox Code Playgroud)
我得到的有以下几点:
我试图理解或计算:
n_fft是什么?我的意思是它到底对音频波做了什么?我在文档中读到以下内容:
n_fft : int > 0 [标量]
用零填充后加窗信号的长度。STFT 矩阵 D 的行数为 (1 + n_fft/2)。默认值 n_fft=2048 个样本,对应于 22050 Hz 采样率下的 93 毫秒物理持续时间,即 librosa 中的默认采样率。
这意味着在每个窗口中采集 2048 个样本,这意味着 --> 1/22050 * 2048 = 93[ms]。每 …
spectrogram ×10
python ×6
matplotlib ×3
audio ×2
librosa ×2
scipy ×2
fft ×1
frequency ×1
matlab ×1
mfcc ×1
python-2.7 ×1
spectrum ×1
wav ×1