我正在尝试用C制作音频频谱图,并考虑使用BASS库:
我在谷歌和这里搜索过,但大多数例子都是用C++编写的.如果您有任何经验或资源,请帮助; 非常感谢.
所以这就是我想要做的:
像这样的东西:

http://upload.wikimedia.org/wikipedia/commons/c/c5/Spectrogram-19thC.png
如果你能提供帮助就会很棒.
所述用于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之间的所有内容,而不是在事后调整轴?
在我的图中,我有2个轴,第一个是信号的时间序列,第二个是信号的时间序列ifft.我想添加一个包含信号频谱图的第3轴.我怎样才能做到这一点?
% Create the raw signal
fs = 40;
t = 0:( 1/fs ):4;
y1 = [ sin( 2*pi*5*t( t<=2 ) ), sin( 2*pi*10*t( t>2 ) ) ];
% Compute the ifft of the signal
Fy1 = abs(ifft(y1));
N = numel(t);
idx = 1:numel(Fy1) / 2;
f = fs*(0:(N-1)) / N;
% Plot the raw signal as a time series
subplot(311);
plot(t,y1,'k');
xlabel('Time (s)');
ylabel('Amplitude');
% Plot the spectrum of the signal
subplot(312);
plot(f(idx),2*Fy1(idx),'k')
xlabel('Frequency (cycles/second)');
ylabel('Amplitude');
Run Code Online (Sandbox Code Playgroud)
我已经尝试过使用该 …
我正在使用apple提供的示例代码aurio touch绘制光谱图.现在我想比较iOS中的两个频谱图,看它们是否相同.是否可以使用Accelerate框架比较两个光谱图?
如果有可能,有人知道如何比较两个光谱图吗?如果没有,是否有任何其他算法或库可以在iOS中用于比较频谱图?
signal-processing objective-c spectrogram ios accelerate-framework
对于辅助项目,我正在使用以下JS插件在浏览器中绘制音频文件的声谱图:
https://www.npmjs.com/package/spectrogram
var spectrogram = require('spectrogram');
var spectro = Spectrogram(document.getElementById('canvas'), {
audio: {
enable: false
}
});
var audioContext = new audioContext();
var request = new XMLHttpRequest();
request.open('GET', 'audio.mp3', true);
request.responseType = 'arraybuffer';
request.onload = function() {
audioContext.decodeAudioData(request.response, function(buffer) {
spectro.addSource(buffer, audioContext);
spectro.start();
});
};
request.send();
Run Code Online (Sandbox Code Playgroud)
(此处提供演示:https : //lab.miguelmota.com/spectrogram/example/)
但是,由于声音当前正在通过缓冲区播放,因此当前代码和示例会“逐行”绘制声谱图。
我想知道是否有一种方法可以实际读取文件,然后一次绘制整个频谱图?我尝试将数组缓冲区转换为Blob,但其余功能实际上希望声音会被缓冲...
所以我的问题是:有没有办法实现我想要的?(立即绘制完整的频谱图,而不是缓冲音频并“随时随地”绘制音频)
有没有更简单的方法来实现我的期望?
感谢您的时间和帮助。
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) 嗨,我对这件事很新,所以请耐心等待.我正在尝试将WAV文件转换为频谱图但不确定如何开始.我读了一些关于读取PCM数据(我认为是我的WAV文件)的内容,并将其存储在WavReader类中的数组中,然后对其应用FFT并将其转换为GUI.我目前正在使用Naudio来实现这一点,但找不到任何显示如何将WAV文件转换为频谱图的内容.谢谢
编辑: 我发现有关使用Naudio将PCM转换为FFT并且我卡住了.
using (var reader = new AudioFileReader("test1.wav"))
{
// test1.wav is my file to process
// test0.wav is my temp file
IWaveProvider stream16 = new WaveFloatTo16Provider(reader);
using (WaveFileWriter converted = new WaveFileWriter("test0.wav", stream16.WaveFormat))
{
// buffer length needs to be a power of 2 for FFT to work nicely
// however, make the buffer too long and pitches aren't detected fast enough
// successful buffer sizes: 8192, 4096, 2048, 1024
// (some pitch detection algorithms need at least …Run Code Online (Sandbox Code Playgroud) 我正在使用神经网络进行语音识别.为此,我需要获取那些训练音频文件(.wav)的频谱图.如何在python中获取这些频谱图?
我正在尝试优化我给出的一些代码,其中 FFT 取自时间序列上的滑动窗口(作为列表给出),并且每个结果都累积到一个列表中。原代码如下:
def calc_old(raw_data):
FFT_old = list()
for i in range(0, len(raw_data), bf.WINDOW_STRIDE_LEN):
if (i + bf.WINDOW_LEN) >= len(raw_data):
# Skip the windows that would extend beyond the end of the data
continue
data_tmp = raw_data[i:i+bf.WINDOW_LEN]
data_tmp -= np.mean(data_tmp)
data_tmp = np.multiply(data_tmp, np.hanning(len(data_tmp)))
fft_data_tmp = np.fft.fft(data_tmp, n=ZERO_PAD_LEN)
fft_data_tmp = abs(fft_data_tmp[:int(len(fft_data_tmp)/2)])**2
FFT_old.append(fft_data_tmp)
Run Code Online (Sandbox Code Playgroud)
和新代码:
def calc_new(raw_data):
data = np.array(raw_data) # Required as the data is being handed in as a list
f, t, FFT_new = spectrogram(data,
fs=60.0,
window="hann",
nperseg=bf.WINDOW_LEN,
noverlap=bf.WINDOW_OVERLAP,
nfft=bf.ZERO_PAD_LEN, …Run Code Online (Sandbox Code Playgroud) 我将一些音频文件转换为频谱图并使用以下代码将它们保存到文件中:
import os
from matplotlib import pyplot as plt
import librosa
import librosa.display
import IPython.display as ipd
audio_fpath = "./audios/"
spectrograms_path = "./spectrograms/"
audio_clips = os.listdir(audio_fpath)
def generate_spectrogram(x, sr, save_name):
X = librosa.stft(x)
Xdb = librosa.amplitude_to_db(abs(X))
fig = plt.figure(figsize=(20, 20), dpi=1000, frameon=False)
ax = fig.add_axes([0, 0, 1, 1], frameon=False)
ax.axis('off')
librosa.display.specshow(Xdb, sr=sr, cmap='gray', x_axis='time', y_axis='hz')
plt.savefig(save_name, quality=100, bbox_inches=0, pad_inches=0)
librosa.cache.clear()
for i in audio_clips:
audio_fpath = "./audios/"
spectrograms_path = "./spectrograms/"
audio_length = librosa.get_duration(filename=audio_fpath + i)
j=60
while j < audio_length: …Run Code Online (Sandbox Code Playgroud) spectrogram ×10
audio ×4
python ×4
fft ×2
matlab ×2
numpy ×2
c ×1
c# ×1
colormap ×1
ios ×1
javascript ×1
librosa ×1
naudio ×1
objective-c ×1
scipy ×1
tensorflow ×1