我正在构建一个基于节奏的游戏,并且在节奏检测方面面临很多问题.我收到了一首播放歌曲的当前频谱.它看起来像一个浮点数组,有512个浮点数.256表示左右声道表示.FFT也可用.但我不知道如何处理这些数据,我已经做了一些可视化的实验,但它给了我很少的信息.我已经搜索了一些现成的算法,但没有任何内容.请,有人可以帮我,也许,一些参考,材料,与节奏检测相关的文章,使用音频频谱.代码也非常有用.谢谢.
为了确定声音的丰富程度,我想确定音乐样本中的谐波数量.为此,我正在使用Processing with Minim库,它为我提供了一个带有FFT的全谱.我想知道如何计算FFT产生的频谱中的所有峰值,我甚至对基频不感兴趣.
以下代码使用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) 我比较了 Matlab 和 numpy 中的相位和幅度谱。我认为 Matlab 工作正确,但 numpy 计算正确的幅度谱,但相位谱很奇怪。我必须如何更改python代码才能通过numpy正确计算fft?
MATLAB:
fs = 1e4;
dt = 1 / fs;
t = 0:dt:0.5;
F = 1e3;
y = cos(2*pi*F*t);
S = fftshift(fft(y) / length(y));
f_scale = linspace(-1, 1, length(y)) * (fs / 2);
a = abs(S);
phi = (angle(S));
subplot(2, 1, 1)
plot(f_scale, a)
title('amplitude')
subplot(2, 1, 2)
plot(f_scale, phi)
title('phase')
Run Code Online (Sandbox Code Playgroud)
Python:
import numpy as np
import matplotlib.pyplot as plt
fs = 1e4
dt = 1 / fs
t = np.arange(0, 0.5, …Run Code Online (Sandbox Code Playgroud) 我已经尝试过一段时间了解我可能会如何解决这个问题,也许我在搜索中使用了错误的术语,或者对我来说太过先进了.我基本上希望能够实时分析音频文件.我对音频处理几乎一无所知,所以我应该从小做起,然后继续努力.最终,我希望能够显示与实时播放音频相关的功率(或频率?)频谱.基本上就像WinAmp的眼图(术语?)
任何一个或两个API建议的在线教程都将不胜感激.我发现了一些模糊的解释(主要是计算FFT然后将它们转换成某种东西......)就像我说的那样,我对音频处理知之甚少,所以知道从哪里开始会很棒.
选择语言:C++
我有一些关于 FFT 的问题(实际上我相信这更多是关于 Visualizer.getFFT() 的 Android FFT 输出)。
我为 Android 创建了一个带有自己的库功能的音乐播放器,其中包括很多东西(如流派、动态播放列表和可视化)。目前,在渲染当前音频流的频谱时,我创建的可视化遇到了一些问题。
我已经阅读了以下问题(和答案)来了解 Android 的 FFT:
Android 2.3 Visualizer - 无法理解 getFft()
现在我的问题是:我从 getFFTs 系数获得的频谱似乎有些“奇怪”。我注意到,在播放歌曲时,我渲染的频谱似乎显示出很多“噪音”,因此我尝试使用一些测试声音。其中之一是简单的 8khz 声音,它应该只在图表中产生一个峰值。不幸的是,结果如下所示:
http://img4.imageshack.us/img4/4181/spectrum8khz.png
底部出现的噪声在图表的整个宽度上闪烁。高条保持在原位,仅在幅度上轻微闪烁。
当我使用从 1kHz 缓慢移动到 20kHz 的测试声音时,它看起来如下(大约 2-3kHz):
http://img846.imageshack.us/img846/7373/spectrum3khz1khz20khz.png
峰从左向右移动,每个峰的移动速度都快一点,因此随着时间的推移,峰之间的距离会逐渐增大。不可见的是,一旦峰值离开右侧屏幕(但幅度较小),它们就会返回并从右向左移动。此外,所有峰都在略大于屏幕 0.5 的位置处连接到一个大峰。
这是我用来检索数据的代码:
for (int i = 1; i < n / 2; i++) {
byte rfk = mRawSpecData[2*i];
byte ifk = mRawSpecData[2*i+1];
float magnitude = (float)Math.sqrt(rfk * rfk + ifk * ifk);
mFormattedSpecData[i-1] = magnitude / 128f;
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我的 mRawSpecData …
我们正在创建一个使用 webRTC 的音频视频应用程序。问题是我们无法显示远程的流频谱,但我们能够显示本地的流频谱。
// setup a analyzer
var analyser = audioCtx.createAnalyser();
analyser.smoothingTimeConstant = 0.0;
analyser.fftSize = 1024;
// get the average for the first channel
var array = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteFrequencyData(array);
var average = getAverageVolume(array);
Run Code Online (Sandbox Code Playgroud)
对于本地流,我们获取数组内的频率值,但对于远程流,我们获取数组内的零值。
如果有任何帮助,将不胜感激。
我有一个感兴趣的化合物的红外光谱,我想绘制,我有一个包含所有数据点的spectrum.dat文件.它的形式如下:
# X Y
300 100
301 100
302 99
303 70
...
3999 98
4000 100
Run Code Online (Sandbox Code Playgroud)
我想用一个典型的红外光谱的x轴来绘制这个图,但我很难这样做.如果您不熟悉,这就是典型的红外光谱可能看起来的样子(除了图表本身的标签).请注意,x轴是相反的,并且它突然将其缩放加倍到2000单位(倒数厘米)以上.有没有办法强迫Gnuplot以这种方式绘制我的数据?到目前为止,我已设法提出以下脚本:
# Make an SVG of size 800x500
set terminal svg size 800,500 fname 'CMU Sans Serif' fsize '10'
set output 'ir.svg'
# Color definitions
set border linewidth 1.5
set style line 1 lc rgb '#a0a0a0' lt 1 lw 2 pt 7 # gray
# Format graph
unset key
set xlabel 'Wavenumbers'
set ylabel 'Transmittance'
set xrange [4000:300]
# …Run Code Online (Sandbox Code Playgroud) 我一直试图了解如何在iOS中绘制Siri的波形效果并遇到了这个伟大的存储库.最终结果如下:
但是我很难理解生成wave的代码发生了什么.我可以生成一个静态正弦波,但是,我似乎并不理解.
特别是当我们计算y的值时,为什么它必须是:
let y = scaling * maxAmplitude * normedAmplitude *
sin(CGFloat(2 * M_PI) * self.frequency * (x / self.bounds.width) + self.phase) + self.bounds.height/2.0
源代码:
//MARK : Properties
let density : CGFloat = 1
let frequency : CGFloat = 1.5
var phase :CGFloat = 0
var phaseShift:CGFloat = -0.15
var numberOfWaves:Int = 6
var primaryLineWidth:CGFloat = 1.5
var idleAmplitude:CGFloat = 0.01
var waveColor:UIColor = UIColor.white
var amplitude:CGFloat = 1.0 {
didSet {
amplitude = max(amplitude, self.idleAmplitude)
self.setNeedsDisplay() …Run Code Online (Sandbox Code Playgroud) 我在Iraf生成的拟合文件中有一个光谱.波长轴在标题中编码为:
WAT0_001= 'system=multispec'
WAT1_001= 'wtype=multispec label=Wavelength units=angstroms'
WAT2_001= 'wtype=multispec spec1 = "1 1 2 1. 2.1919422441886 4200 0. 452.53 471'
WAT3_001= 'wtype=linear'
WAT2_002= '.60 1. 0. 3 3 1. 4200.00000000001 1313.88904209266 1365.65012876239 '
WAT2_003= '1422.67911152069 1479.0560707956 1535.24082980747 1584.94609332243'
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法将其加载到python中?