对于我目前在C++/Qt中的项目,我需要一个库(LGPL是首选),它可以根据信号(基本上是双精度数组)计算频谱图.我已经使用Qwt作为GUI部分.
有什么建议?谢谢.
我是MATLAB的初学者,我应该对EEG信号进行频谱分析,绘制功率谱密度和频谱图.我的信号是10几秒长,一个采样频率160 Hz,总共1600 samples有一些关于如何在MATLAB中找到函数参数的问题,包括:
pwelch (x, window, noverlap, nfft, fs);
spectrogram (x, window, noverlap, F, fs);
Run Code Online (Sandbox Code Playgroud)
那么我的问题是在哪里找到参数的值window,noverlap我不知道它们的用途.
我试图从python3中的.wav文件创建一个频谱图.
我希望最终保存的图像看起来与此图像类似:
我尝试过以下方法:
这个堆栈溢出帖子: 波形文件的谱图
这篇文章有点奏效了.运行后,我得到了
但是,此图表不包含我需要的颜色.我需要一个有颜色的光谱图.我尝试修补这些代码尝试添加颜色但是在花费了大量时间和精力之后,我无法理解它!
然后我尝试了本教程.
当我尝试使用错误TypeError运行它时,此代码崩溃(在第17行):'numpy.float64'对象不能被解释为整数.
第17行:
samples = np.append(np.zeros(np.floor(frameSize/2.0)), sig)
Run Code Online (Sandbox Code Playgroud)
我试图通过施法修复它
samples = int(np.append(np.zeros(np.floor(frameSize/2.0)), sig))
Run Code Online (Sandbox Code Playgroud)
而且我也试过了
samples = np.append(np.zeros(int(np.floor(frameSize/2.0)), sig))
Run Code Online (Sandbox Code Playgroud)
然而,这些都没有最终奏效.
我真的想知道如何将我的.wav文件转换为带有颜色的光谱图,以便我可以分析它们!任何帮助,将不胜感激!!!!!
请告诉我你是否希望我提供有关我的python版本,我尝试过的内容或我想要实现的内容的更多信息.
在Pylab中,该specgram()函数为给定的幅度列表创建频谱图,并自动为频谱图创建窗口.
我想生成频谱图(瞬时功率由下式给出Pxx),通过在其上运行边缘检测器对其进行修改,然后绘制结果.
(Pxx, freqs, bins, im) = pylab.specgram( self.data, Fs=self.rate, ...... )
Run Code Online (Sandbox Code Playgroud)
问题是每当我尝试Pxx使用imshow或甚至修改修改时NonUniformImage,我都会遇到下面的错误消息.
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/image.py:336:UserWarning:非线性轴不支持图像.warnings.warn("非线性轴不支持图像.")
例如,我正在使用的代码的一部分在下面.
# how many instantaneous spectra did we calculate
(numBins, numSpectra) = Pxx.shape
# how many seconds in entire audio recording
numSeconds = float(self.data.size) / self.rate
ax = fig.add_subplot(212)
im = NonUniformImage(ax, interpolation='bilinear')
x = np.arange(0, numSpectra)
y = np.arange(0, numBins)
z = Pxx
im.set_data(x, y, z)
ax.images.append(im)
ax.set_xlim(0, numSpectra)
ax.set_ylim(0, numBins)
ax.set_yscale('symlog') # see http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.set_yscale …Run Code Online (Sandbox Code Playgroud) 我有一个音频文件,我正在遍历文件,每步取512个样本,然后通过FFT.
我将数据输出为块514浮动(使用IPP的ippsFFTFwd_RToCCS_32f_I),其中实部和虚部交错.
我的问题是,一旦我拥有这些复杂数字,我该怎么办?目前我正在为每个价值做
const float realValue = buffer[(y * 2) + 0];
const float imagValue = buffer[(y * 2) + 1];
const float value = sqrt( (realValue * realValue) + (imagValue * imagValue) );
Run Code Online (Sandbox Code Playgroud)
这提供了一些稍微有用的东西,但我更倾向于在0到1的范围内获得值.上面的问题是峰值最终会回到9或更多.这意味着事情会恶化饱和,然后光谱图的其他部分几乎不会出现,尽管当我通过试听的频谱图运行音频时它们看起来非常强大.我完全承认我不是100%确定FFT返回的数据是什么(除了它代表我传入的512个样本长块的频率值).特别是我的理解是缺乏compex数字代表什么.
任何建议和帮助将不胜感激!
编辑:只是为了澄清.我的一个大问题是,如果不知道比例是什么,返回的FFT值是没有意义的.有人能指出我制定这种规模吗?
Edit2:通过执行以下操作,我得到了非常好看的结果:
size_t count2 = 0;
size_t max2 = kFFTSize + 2;
while( count2 < max2 )
{
const float realValue = buffer[(count2) + 0];
const float imagValue = buffer[(count2) + 1];
const float value = (log10f( sqrtf( (realValue * realValue) + (imagValue * …Run Code Online (Sandbox Code Playgroud) 如何生成包含 wav/riff 声音文件频率频谱的文件?我想使用 linux 命令行。
我知道很酷的 sox 函数来生成 png 频谱图
sox sound.wav -n spectrogram
Run Code Online (Sandbox Code Playgroud)
但我不需要频率频谱的视觉表示。我只想在数据文件中获取频谱,以便我可以处理它们。我相信必须有使用 sox 的选项。Sox 需要在绘制数据之前生成该数据。如何得到这个?
不确定,也许第二个解决方案是将 wav 文件导出到 dat 文件中。来自 dat 文件的每个样本都是膜在某一时刻的位置的度量。所以这不是频谱。
sox sound.wav file.dat
Run Code Online (Sandbox Code Playgroud)
如何将这些膜位置转换为我需要的光谱?
谢谢。
对于项目,我需要能够从.WAV文件生成频谱图.我已经读过以下应该做的事情:
在下图中,您可以看到两个使用汉宁窗函数的10000 Hz正弦波谱图.在左侧,您可以看到由audacity生成的谱图,右侧是我的版本.你可以看到我的版本有更多的线/噪音.这是不同箱子的泄漏?如何获得像大胆产生的清晰图像.我应该做一些后期处理吗?我还没有做任何规范化,因为不完全了解如何这样做.

更新
我发现本教程解释了如何在c ++中生成频谱图.我编译了源代码,看看我能找到什么差异.
说实话,我的数学非常生疏,所以我不确定规范化在这里做了什么:
for(i = 0; i < half; i++){
out[i][0] *= (2./transform_size);
out[i][6] *= (2./transform_size);
processed[i] = out[i][0]*out[i][0] + out[i][7]*out[i][8];
//sets values between 0 and 1?
processed[i] =10. * (log (processed[i] + 1e-6)/log(10)) /-60.;
}
Run Code Online (Sandbox Code Playgroud)
在这之后我得到了这个图像(顺便说一下,我把颜色颠倒了):

然后我看一下我的声音库和教程之一提供的输入样本的差异.我的方式更高,所以我手动归一化是将其除以因子32767.9.然后我去看看这个看起来相当不错的图片.但除以这个数字似乎是错误的.我希望看到一个不同的解决方案.

这是完整的相关源代码.
void Spectrogram::process(){
int i;
int transform_size = 1024;
int half = transform_size/2;
int step_size = transform_size/2;
double in[transform_size];
double processed[half];
fftw_complex *out;
fftw_plan p; …Run Code Online (Sandbox Code Playgroud) 我试图绘制我的时域信号的谱图:
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的新手,我只是没有理解.任何帮助将不胜感激!
经过研究和大量的试验和错误,我已经到了一个点,我可以构建一个谱图,我认为它具有正确和错误的元素.
1.首先,我将.wav文件读入字节数组并仅提取数据部分.
2.我将字节数组转换为双数组,取左右声道的平均值.我还注意到1个通道的1个样本由2个字节组成.所以,4个字节变为1个双精度.
3.对于某个窗口大小为2的功率,我从这里应用FFT 并得到频域的幅度.这是谱图图像的垂直条带.
4.我使用相同的窗口大小重复执行此操作并重叠整个数据并获得频谱图.
以下是将.wav读入双数组的代码
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
public class readWAV2Array {
private byte[] entireFileData;
//SR = sampling rate
public double getSR(){
ByteBuffer wrapped = ByteBuffer.wrap(Arrays.copyOfRange(entireFileData, 24, 28)); // big-endian by default
double SR = wrapped.order(java.nio.ByteOrder.LITTLE_ENDIAN).getInt();
return SR;
}
public readWAV2Array(String filepath, boolean print_info) throws IOException{
Path path = Paths.get(filepath);
this.entireFileData = Files.readAllBytes(path);
if (print_info){
//extract format
String format = new …Run Code Online (Sandbox Code Playgroud) 我正在尝试.wav使用Python 从文件中计算出频谱图。为了做到这一点,我遵循此处的说明。我首先.wav使用librosa库读取文件。在链接中找到的代码可以正常工作。该代码是:
sig, rate = librosa.load(file, sr = None)
sig = buf_to_int(sig, n_bytes=2)
spectrogram = sig2spec(rate, sig)
Run Code Online (Sandbox Code Playgroud)
和功能sig2spec:
def sig2spec(signal, sample_rate):
# Read the file.
# sample_rate, signal = scipy.io.wavfile.read(filename)
# signal = signal[0:int(1.5 * sample_rate)] # Keep the first 3.5 seconds
# plt.plot(signal)
# plt.show()
# Pre-emphasis step: Amplification of the high frequencies (HF)
# (1) balance the frequency spectrum since HF usually have smaller magnitudes compared to LF
# (2) avoid numerical …Run Code Online (Sandbox Code Playgroud)