我不知道怎么做这个,我得到了一个例子,谱图,但这是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) 我用 gnuplot 4.6 版绘制了一个频谱图。我确保它是最新版本:http : //www.gnuplot.info/download.html
Gnuplot 是从 Debian 存储库安装的。
右侧的绘图区域和比例尺包含奇怪的白线。他们似乎将数据分开。在数据密集的绘图区域,它们看起来像方格图案:

线条在刻度上不太明显,但它们也在那里。秤上只有水平线。
我认为这是显示器色域或其他东西的情况,但线条也会出现在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) 所述用于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 中有一个程序,我想将它移植到 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) x是一个numpy.float32数组,使用来自值-200到0.这些是dB(分贝)值.
当我这样做时(按照此处的建议):
Image.fromarray(x, mode='F')
Run Code Online (Sandbox Code Playgroud)
我得到一个灰度或有时几乎是黑色的图像.
如何将[-200,0]中的float映射到24位RGB字节数组(使用色彩映射),可以使用Python模块PIL读取Image.fromarray(x, mode='RGB')?
这是一些要测试的代码:
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) 我正在尝试将 CNN 的验证准确率从 76%(当前)提高到 90% 以上。我将在下面展示有关我的 CNN 性能和配置的所有信息。
本质上,我希望我的 CNN 区分两类梅尔谱图:
这是损失与时代的关系图
最后,这里是模型架构配置
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 我将时代数增加到 200,在让程序运行一夜之后,我得到了大约 76.31% …
我正在关注scipy.signal.spectrogram 上的教程示例。是否可以限制我们想要计算频谱图的频率,假设在 1000-2000Hz 范围内。根据 FFT,我们将获得一半的采样频率。如果不是,那么我可以对输出进行切片以获得 3D 矩阵,t,f,Sxx其中我将频率限制为 1000-2000 Hz?在我的情况下,我的信号仅包含特定范围的频率,并且保留所有频率对我的分析来说代价高昂。
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)
然后我得到以下频谱图 …
我有:
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)
然而,这会产生一个(接近)空的声音文件。
我创建了 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)
spectrogram ×10
python ×6
scipy ×4
librosa ×2
matlab ×2
python-3.x ×2
colormap ×1
fft ×1
gnuplot ×1
keras ×1
matplotlib ×1
numpy ×1
tensorflow ×1