标签: spectrogram

如何在python中生成一维信号的频谱图?

我不知道怎么做这个,我得到了一个例子,谱图,但这是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)

python spectrogram

6
推荐指数
1
解决办法
1万
查看次数

gnuplot pm3d 得到白线

我用 gnuplot 4.6 版绘制了一个频谱图。我确保它是最新版本:http : //www.gnuplot.info/download.html

Gnuplot 是从 Debian 存储库安装的。

右侧的绘图区域和比例尺包含奇怪的白线。他们似乎将数据分开。在数据密集的绘图区域,它们看起来像方格图案:

http://imageshack.us/a/img822/6219/linese.png

线条在刻度上不太明显,但它们也在那里。秤上只有水平线。

我认为这是显示器色域或其他东西的情况,但线条也会出现在pdf monochrome.

我的代码是:

#!/usr/bin/gnuplot

set term pdf
# set style fill noborder # checked with and without this line
set output "../results1/fft.pdf"
set pm3d map
splot "../results1/fft.dat"
Run Code Online (Sandbox Code Playgroud)

正如您在那里阅读的那样,我尝试使用选项 noborder 但无论是否存在线条都存在。

示例数据可以是:

0 1 3
0 2 3
0 3 4
0 4 2
0 5 2
0 6 3
0 7 4
0 8 3

1 1 3
1 2 2
1 3 4
1 …
Run Code Online (Sandbox Code Playgroud)

gnuplot spectrogram

5
推荐指数
1
解决办法
2021
查看次数

我可以调整频谱轴频率吗?

所述用于MATLAB文档示例spectrogram函数给出了具有设置为在频率轴上的例子[0 500].我可以将其更改为类似的内容[0 100]吗?显然运行axis命令会为我做这个,但是这会调整最终结果并"炸毁"结果图,使其像素化.我基本上希望建立一个仅在0-100之间寻找频率的频谱图,而不是在建立频谱图后重新调整频率.

以下是该文档的示例:

T = 0:0.001:2;
X = chirp(T,0,1,150);
spectrogram(X,256,250,256,1E3,'yaxis');
Run Code Online (Sandbox Code Playgroud)

这产生以下结果: 线性啁啾谱图

低于350Hz的所有东西都是不需要的.有没有办法在构建频谱图时不包括350到500之间的所有内容,而不是在事后调整轴?

matlab spectrogram

5
推荐指数
1
解决办法
1万
查看次数

MATLAB 和 Python 之间的不同频谱图

我在 MATLAB 中有一个程序,我想将它移植到 Python。问题是我在其中使用了内置spectrogram函数,虽然 matplotlibspecgram函数看起来相同,但当我同时运行这两个函数时,我得到了不同的结果。

这些是我一直在运行的代码。

MATLAB:

data = 1:999; %Dummy data. Just for testing.

Fs = 8000; % All the songs we'll be working on will be sampled at an 8KHz rate

tWindow = 64e-3; % The window must be long enough to get 64ms of the signal
NWindow = Fs*tWindow; % Number of elements the window must have
window = hamming(NWindow); % Window used in the spectrogram

NFFT = 512;
NOverlap = NWindow/2; % …
Run Code Online (Sandbox Code Playgroud)

python matlab signal-processing matplotlib spectrogram

5
推荐指数
1
解决办法
2687
查看次数

将浮点数组渲染为24位RGB图像(例如,使用PIL)

x是一个numpy.float32数组,使用来自值-2000.这些是dB(分贝)值.

当我这样做时(按照此处的建议):

Image.fromarray(x, mode='F')
Run Code Online (Sandbox Code Playgroud)

我得到一个灰度或有时几乎是黑色的图像.

如何将[-200,0]中的float映射到24位RGB字节数组(使用色彩映射),可以使用Python模块PIL读取Image.fromarray(x, mode='RGB')


编辑:

所需的.wav音频文件是在这里,为此我们要绘制的频谱.

这是一些要测试的代码:

import scipy, numpy as np
import scipy.io.wavfile as wavfile
import numpy as np
from PIL import Image

def stft(x, fftsize=1024, overlap=4): 
    hop = fftsize / overlap
    w = scipy.hanning(fftsize+1)[:-1]
    return np.array([np.fft.rfft(w*x[i:i+fftsize]) for i in range(0, len(x)-fftsize, hop)])

def dB(ratio):
    return 20 * np.log10(ratio+1e-10)

def magnitudedB(frame, fftsize=1024):
    w = scipy.hanning(fftsize+1)[:-1]
    ref = np.sum(w) / 2
    return …
Run Code Online (Sandbox Code Playgroud)

python numpy spectrogram python-imaging-library colormap

5
推荐指数
1
解决办法
2440
查看次数

在 Python3 中使用 Keras 优化 CNN 的架构

我正在尝试将 CNN 的验证准确率从 76%(当前)提高到 90% 以上。我将在下面展示有关我的 CNN 性能和配置的所有信息。

本质上,我希望我的 CNN 区分两类梅尔谱图:

第 1 类 第 1 类 第 2 类 在此处输入图片说明 这是准确率与纪元的关系图:

在此处输入图片说明

这是损失与时代的关系图

在此处输入图片说明

最后,这里是模型架构配置

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(3, 640, 480)))
model.add(Conv2D(64, (3, 3), activation='relu', dim_ordering="th"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(2, activation='softmax'))
Run Code Online (Sandbox Code Playgroud)

这是我对 model.compile() 和 model.fit() 的调用

model.compile(loss=keras.losses.categorical_crossentropy,
          optimizer=keras.optimizers.SGD(lr=0.001),
          metrics=['accuracy'])
print("Compiled model")

history = model.fit(X_train, Y_train,
      batch_size=8,
      epochs=50,
      verbose=1,
      validation_data=(X_test, Y_test))
Run Code Online (Sandbox Code Playgroud)

如何更改我的 CNN 配置以提高验证准确度分数?

我尝试过的事情:

  1. 降低学习率以防止准确性的零星波动。
  2. 将 batch_size 从 64 减少到 8。
  3. 将时代数增加到 50(但不确定这是否足够)。

任何帮助将不胜感激!

更新 #1 我将时代数增加到 200,在让程序运行一夜之后,我得到了大约 76.31% …

spectrogram python-3.x deep-learning keras tensorflow

5
推荐指数
1
解决办法
1986
查看次数

限制 scipy.signal.spectrogram 仅计算特定频率

我正在关注scipy.signal.spectrogram 上的教程示例。是否可以限制我们想要计算频谱图的频率,假设在 1000-2000Hz 范围内。根据 FFT,我们将获得一半的采样频率。如果不是,那么我可以对输出进行切片以获得 3D 矩阵,t,f,Sxx其中我将频率限制为 1000-2000 Hz?在我的情况下,我的信号仅包含特定范围的频率,并且保留所有频率对我的分析来说代价高昂。

signal-processing fft scipy spectrogram

5
推荐指数
1
解决办法
1753
查看次数

Librosa 的 fft 和 Scipy 的 fft 不同?

Librosa 和 Scipy 都有这个fft功能,但是,即使输入相同的信号,它们也会给我不同的频谱图输出。

西比

我正在尝试使用以下代码获取频谱图

import numpy as np                                       # fast vectors and matrices
import matplotlib.pyplot as plt                          # plotting
from scipy import fft      

X = np.sin(np.linspace(0,1e10,5*44100))

fs = 44100          # assumed sample frequency in Hz
window_size = 2048  # 2048-sample fourier windows
stride = 512        # 512 samples between windows
wps = fs/float(512) # ~86 windows/second
Xs = np.empty([int(2*wps),2048])

for i in range(Xs.shape[0]):
    Xs[i] = np.abs(fft(X[i*stride:i*stride+window_size]))

fig = plt.figure(figsize=(20,7))
plt.imshow(Xs.T[0:150],aspect='auto')
plt.gca().invert_yaxis()
fig.axes[0].set_xlabel('windows (~86Hz)')
fig.axes[0].set_ylabel('frequency')
plt.show()
Run Code Online (Sandbox Code Playgroud)

然后我得到以下频谱图 …

python scipy spectrogram python-3.x librosa

5
推荐指数
1
解决办法
4066
查看次数

如何使用 Python 将 scipy.signal.spectrogram 反转为音频?

我有:

import librosa
from scipy import signal 
import scipy.io.wavfile as sf    

samples, sample_rate = sf.read(args.file)
nperseg = int(sample_rate * 0.001 * 20)
frequencies, times, spectrogram = signal.spectrogram(samples, 
                                                     sample_rate, 
                                                     nperseg=nperseg, 
                                                     window=signal.hann(nperseg))

audio_signal = librosa.griffinlim(spectrogram)
print(audio_signal, audio_signal.shape)

sf.write('test.wav', audio_signal, sample_rate)
Run Code Online (Sandbox Code Playgroud)

然而,这会产生一个(接近)空的声音文件。

python scipy spectrogram librosa

5
推荐指数
1
解决办法
5384
查看次数

如何使频谱图的 x 轴从 0 开始并在整个持续时间结束?

我创建了 4 秒长的数据并绘制了其频谱图。nperseg 被指定为 100。由于此窗口长度,x 轴不会从 0 开始并在 4s 结束。有没有办法将频谱图的时间轴与原始时域信号对齐?

from scipy import signal
import matplotlib.pyplot as plt
import numpy as np

fs = 100
N = 400
time = np.arange(N) / float(fs)
y = 500*np.cos(2*np.pi*5*time)

f, t, Sxx = signal.spectrogram(y, fs, nperseg = 100)
plt.pcolormesh(t, f, Sxx, shading='gouraud')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.show()

plt.plot(time, y)
Run Code Online (Sandbox Code Playgroud)

下图是一个例子,时域信号和频谱图都是从0开始到1s结束。时域信号和频谱图

python scipy spectrogram

5
推荐指数
1
解决办法
904
查看次数