找到信号的基频

Posted

技术标签:

【中文标题】找到信号的基频【英文标题】:Find fundamental frequency of signal 【发布时间】:2019-03-13 10:18:29 【问题描述】:

我有 1000 个数据集,每个数据集都包含 8000 个信号幅度和一个标签 - 该信号的基频。构建神经网络以预测新提供的信号的基频的最佳方法是什么?

例如: 基频:75.88206932 Hz 数据片段:

 -9.609272558949627507e-02
 -4.778297441391140543e-01
 -2.434520972570237696e-01
 -1.567176020112603263e+00
 -1.020037056101358752e+00
 -1.129608807811322446e+00
  4.303651786855859918e-01
 -3.936956061582048694e-01
 -1.224883726737033163e+00
 -1.776803300708089672e+00

我创建的模型:(训练集形状:(600,8000,1)

  model=Sequential() 
  model.add(Conv1D(filters=64, kernel_size=3, activation='tanh', \
                    input_shape=(data.shape[1],data.shape[2]))) 
  model.add(MaxPooling1D(pool_size=2)) 
  model.add(Conv1D(filters=64, kernel_size=3, activation='tanh')) 
  model.add(MaxPooling1D(pool_size=2)) 
  model.add(Conv1D(filters=64, kernel_size=3, activation='tanh')) 
  model.add(MaxPooling1D(pool_size=2)) 
  model.add(Flatten())
  model.add(Dense(500, activation='tanh'))
  model.add(Dropout(0.2))
  model.add(Dense(50, activation='tanh'))
  model.add(Dropout(0.2))
  model.add(Dense(1, activation='linear')) 

  model.compile(loss='mean_squared_error', optimizer='adam', metrics=["accuracy"])

但模型不想训练。准确度~ 0.0。 我很感激任何建议。

【问题讨论】:

@desertnaut 谢谢你的评论。我已经更新了问题。 干得好 - 否决票撤回 ;) 【参考方案1】:

构建神经网络进行预测的最佳方法是什么 新提供的信号的基频?

这对于 SO 来说是一个过于宽泛的问题,因此您不应该期待任何足够详细且有意义的答案。

也就是说,您的代码存在某些问题,纠正这些问题可能会让您更接近实现最终目标。

所以,你犯了一个非常根本性的错误:

准确度只适用于分类问题;对于回归(即数字预测),例如您的,准确性毫无意义

更重要的是,不幸的是,Keras 不会“保护”您或任何其他用户免于在您的代码中放置此类无意义的请求,即您不会收到任何错误,甚至不会收到警告,表明您正在尝试执行以下操作没有意义,例如在回归设置中要求准确性;有关更多详细信息和实际演示,请参阅我在 What function defines accuracy in Keras when the loss is mean squared error (MSE)? 中的回答。

因此,您的性能指标实际上与您的损失相同,即均方误差 (MSE);您应该尽量减少验证集中的这个数量,并从模型编译中完全删除 metrics=['accuracy'] 参数。

此外,现在我们几乎从不使用tanh 激活隐藏层;你应该改用relu

【讨论】:

你的回答让我意识到我必须回到基金会,谢谢。但是我怎么知道我的模型是否足够好?例如在分类问题中准确率在 [0,1] 范围内,其中 1.0 是完美的准确率,在回归问题中我可以使用 RMSE 作为度量,完美的当然等于 0.0,但它没有上限。那么如何应对呢? @Alexandra 不客气。这确实是回归模型的一个问题,并且没有现成的方法。绘制预测值与实际值,以及计算因差异而产生的任何实际成本是最初的方法......【参考方案2】:

您可以先对数据进行 FFT,无论有无窗口,然后将 FFT 幅度向量用作 ML 训练数据向量。

【讨论】:

以上是关于找到信号的基频的主要内容,如果未能解决你的问题,请参考以下文章

声音信号处理基频检测和时频分析

声音信号基音提取算法基频和谐波处理分析

实时音频编解码之四 LPC和LSF

哈工大视听觉信号处理——听觉部分报告——一种智能家居命令词识别系统的设计

谐波乘积谱的 MATLAB 代码

实时音频编解码之十五 Opus编码-CELT编码