我有一个长64个样本的波形.如果采样率为44100 hz,我该如何播放(循环)此波形以使其播放任意频率?
频率=样本中的采样率/波形持续时间
因此频率应为689hz(44100/64).如果我想要它,65.41hz(C-2),我必须这样做:
65.41 = 44100/x
求解x得到aprox.674.208.因此,我需要弄清楚播放波形的速度,以获得此频率.所以我们可以解决这个等式:
64*x = 674.208
得到大约10.5.因此波形需要以其原始速度的10.5%播放.
这是我的代码:
double smp_index = 0;
double freq = .105;
void callback(void *data, Uint8 *buf, int len){
int i;
s8 *out;
out = (s8*) buf;
if(smp_index < waveform_length){
for(i = 0; i < len; i ++){
out[i] = smpdata[(int)smp_index];
smp_index +=freq;
if(smp_index >= waveform_length)
smp_index = 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此产生的音频应该是关于音符C-2,但它更多的是D-2.是演员
(int)smp_index
Run Code Online (Sandbox Code Playgroud)
造成这个问题?我看不到任何其他方法来实现这个目标......
我正在尝试用Java开发一个静态方法来生成纯音.
在开始时它似乎很容易,但是当我尝试将双阵列写入扬声器时,我欣赏太多的谐波.
我用频谱分析仪(声压计)测试它,然后我也在图形中绘制了数组结果.当我完成它时,我已经看到了问题:
这是波形,它已经中断了.我想平滑这个数组,但我不知道该怎么做.
这是代码:
/**
* Genera un tono puro.
* @param bufferSize Tamaño del buffer.
* @param fs Frecuencia de muestreo.
* @param f0 Frecuencia central.
* @return El tono puro.
*/
public static double[] generateTone(int bufferSize, int fs, int f0) {
double[] tone = new double[bufferSize]; // Tono
double angle; // Ángulo del tono
// Sólo hace falta recorrer la mitad del array, ya que hay simetría:
for (int i = 0; i < tone.length / 2; …Run Code Online (Sandbox Code Playgroud) 假设有人想找出给定正弦波信号的周期。从我在网上阅读的内容来看,这两种主要方法似乎采用了傅立叶分析或自相关。我正在尝试使用 python 自动化该过程,我的用例是将此概念应用于来自围绕恒星运行的模拟物体的位置(或速度或加速度)时间序列的类似信号。
为了简单的例子,考虑x = sin(t)for 0 ? t ? 10 pi。
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
## sample data
t = np.linspace(0, 10 * np.pi, 100)
x = np.sin(t)
fig, ax = plt.subplots()
ax.plot(t, x, color='b', marker='o')
ax.grid(color='k', alpha=0.3, linestyle=':')
plt.show()
plt.close(fig)
Run Code Online (Sandbox Code Playgroud)
给定形式x = a sin(b(t+c)) + d为 的正弦波,正弦波的周期为2 * pi / b。由于b=1(或通过目视检查),我们的正弦波的周期是2 * pi。我可以根据此基线检查从其他方法获得的结果。
尝试 1:自相关
据我了解(如果我错了,请纠正我),相关性可用于查看一个信号是否是另一个信号的时间滞后副本(类似于余弦和正弦因相位差而不同)。因此,自相关是针对自身测试信号,以测量时滞重复所述信号的时间。使用此处发布的示例 …
我已经在Stackoverflow和谷歌搜索过,但还没找到我想要的东西.
到目前为止,我得到了音频原始数据(WAV文件),我想要将其可视化.
private void Form1_Load(object sender, EventArgs e)
{
FileStream fs = new FileStream("D:\\tada.wav", FileMode.Open);
BinaryReader reader = new BinaryReader(fs);
char[] data = new char[4];
long fsize;
long wfxSize;
long dataSize;
WaveFormatEx wfx;
//RIFF
reader.Read(data, 0, 4);
fsize = reader.ReadInt32();
//WAVE
reader.Read(data, 0, 4);
//FMT
reader.Read(data, 0, 4);
wfxSize = reader.ReadInt32();
byte[] wfxBuffer = new byte[wfxSize];
reader.Read(wfxBuffer, 0, (int)wfxSize);
wfx = new WaveFormatEx(wfxBuffer);
//DATA
reader.Read(data, 0, 4);
dataSize = reader.ReadInt32();
byte[] dataBuff = new byte[dataSize];
reader.Read(dataBuff, 0, (int)dataSize);
reader.Close();
//Visualize …Run Code Online (Sandbox Code Playgroud) 我一直对此感到好奇,所以我想在这里发帖我可以得到一些好的答案.
到目前为止我所知道的:
人类可以用他们的两只耳朵来获取听起来"听起来像"的声音,以及它们来自哪里.音高是我们听到的音符,类似人声的音高有多种音高(不是纯音).
我想知道的是什么:
我如何编写一个可以知道声音来自何处的程序?从理论的角度来看,我需要两个麦克风,然后我会记录进入麦克风的声音数据并存储音频数据,以便将一瞬间的音频数据放入像[streamA,streamB]这样的元组中.
我觉得可能有一种公式/数学方法可以根据声音的来源进行计算.我也觉得可以获取流数据并训练学习者(给它采样音频并告诉它来自音频的位置)并让它以这种方式对传入的音频进行分类.
这样做的最佳方式是什么?是否有足够的资源可以从中学到更多关于这个主题的知识?
编辑:
例:
Run Code Online (Sandbox Code Playgroud)front左(麦克风)x ======== x(麦克风)对
Run Code Online (Sandbox Code Playgroud)back x (sound source should return "back" or "right" or "back right")
我想写一个程序,它可以返回前/后左/右声音听到的大部分声音.根据我的理解,设置两个指向"前进"的麦克风应该很简单.基于此,我试图找出一种方法,我们可以对声音进行三角测量,并知道与麦克风相关的来源.
有没有人知道是否可以使用Javascript从youtube播放器中播放的视频中呈现音频波形?谢谢!
这次我有很多问题,虽然它们都与同样的问题有关:我想在Android中构建一个基本的声纳,并且不知道如何做这样的事情.
只是想在这里定位,因为我对移动应用程序中的声音处理真的很陌生.提前致谢!
我需要能够读取由磁性墨水中创建的任意形状产生的波形.如何以编程方式模拟这个?
我对OCR 不感兴趣.根据磁性墨水字符识别,并假设您有E13B字体和渲染到JPG/PNG上的字符:
纸平面中的墨水首先被磁化.然后字符通过MICR读头,类似于录音机的播放头的设备.当每个角色经过头部时,它会产生一个独特的波形,系统可以很容易地识别出来.
任何编程语言的解决方案的任何指导将不胜感激.
我正在尝试在给定的持续时间内生成给定频率的正弦波,然后将其写入 .wav 文件。我正在使用 numpy 的 sin 函数和 scipy 的 wavfile 函数。我听到一种奇怪的声音,这绝对不是正弦波。
import numpy as np
from scipy.io import wavfile
fs = 44100
f = int(raw_input("Enter fundamental frequency: "))
t = float(raw_input("Enter duration of signal (in seconds): "))
samples = np.arange(t * fs)
signal = np.sin(2 * np.pi * f * samples)
signal *= 32767
signal = np.int16(signal)
wavfile.write(str(raw_input("Name your audio: ")), fs, signal)
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激。我是否对正弦波或其他东西做出了一些根本不正确的假设?
我正在开发一个 Telegram 机器人,我有一个关于发送语音(音频)消息的sendvoice API的问题。
我推送一个从 MP3 源文件转换而来的 OGG 文件,使用 ffmpeg 进行转换,命令如下:
$ ffmpeg -loglevel panic -i \
/path/to/la_piattaforma_telegram_è_perfetta.mp3 \
-c:a libopus -compression_level 10 -frame_duration 60 -vbr on -application voip \
/path/to/la_piattaforma_telegram_è_perfetta.ogg -y
Run Code Online (Sandbox Code Playgroud)
顺便说一句,MIME 类型显示正确:
$ file --mime-type -b \
/path/to/la_piattaforma_telegram_è_perfetta.ogg
audio/ogg
Run Code Online (Sandbox Code Playgroud)
音频文件按预期正确播放,但我遇到的(次要)问题是 Telegram 客户端(桌面/安卓/任何)不显示“波形”(音频频谱图,如下图的蓝色小部件所示),而是将波形可视化为单条线。
关于如何显示波形图形的任何想法?是否需要任何特定的 OPUS 格式才能实现良好的可视化?
$ mediainfo /path/to/la_piattaforma_telegram_è_perfetta.ogg
General
Complete name : /path/to/la_piattaforma_telegram_è_perfetta.ogg
Format : Ogg
File size : 5.37 KiB
Duration : 2 s 79 ms
Overall bit rate : 21.2 kb/s
Audio …Run Code Online (Sandbox Code Playgroud) waveform ×10
audio ×4
javascript ×2
python ×2
android ×1
api ×1
bots ×1
c ×1
c# ×1
callback ×1
fft ×1
java ×1
magnetometer ×1
numpy ×1
objective-c ×1
ogg ×1
scipy ×1
sdl ×1
signals ×1
telegram ×1
time-series ×1
trigonometry ×1
wav ×1
youtube ×1