什么是好的数字信号处理算法,这对吉他和弦有好处?由于快速傅里叶变换,我认为只有在吉他上演奏的单个音符才准确,而不是同时演奏的音符(即和弦).
谢谢!
我最近一直在考虑使用自相关进行音高检测.但是,我发现很难找到学习自相关的好地方,我的意思是这些资源可以让你逐步理解自相关.
我不是一个非常优秀的程序员,也没有真正的公式,所以我找到的来源真的很难理解.
基本上,我现在知道的是自相关的概念就像信号的比较和对比方法一样?但如果我能更好地理解自相关算法,我将非常感激.
非常感谢你!
更新:这是我从网站获得的示例代码.也许你可以用它作为参考.我已经测试了这段代码,它确实正确地返回了正确的音高(尽管这里有一些不正确的音调)
maxOffset = sampleRate / minFreq;
minOffset = sampleRate / maxFreq;
for (int lag = maxOffset; lag >= minOffset; lag--)
{
float corr = 0; // this is calculated as the sum of squares
for (int i = 0; i < framesize; i++)
{
int oldIndex = i - lag;
float sample = ((oldIndex < 0) ? prevBuffer[frames + oldIndex] : buffer[oldIndex]);
corr += (sample * buffer[i]);
}
if (corr > maxCorr)
{
maxCorr = corr; …Run Code Online (Sandbox Code Playgroud) 如何在RichTextBox中对齐文本?

基本上,RTB包含:
"--testing"
"--TESTING"
"TESTING--"
"testing--"
它们具有相同数量的字符,但具有不同的对齐方式.如何正确对齐它们?我对C#很新,因为它在Java的TextArea中正确对齐而感到困惑.
谢谢!
我的项目遇到了这个错误,涉及使用数字音频信号.
所以我一直在获得振幅值,最近遇到了这个错误.当调试时遇到的幅度值为"-32768"时会发生这种情况.我将值存储在short []数组中.
我有一种预感,它与最大/最小值有关(我使用Math.Abs),但我不确定如何处理它.
有人可以帮忙吗?谢谢!
我一直在试验FFT算法.我使用NAudio以及来自互联网的FFT算法的工作代码.根据我对性能的观察,得到的音高是不准确的.
会发生的事情是我有一个MIDI(由GuitarPro生成)转换为WAV文件(44.1khz,16位,单声道),其中包含从E2(最低吉他音符)到大约E6的音高级数.低音(E2-B3附近)的结果通常是非常错误的.但达到C4有点正确,因为你已经可以看到正确的进展(下一个音符是C#4,然后是D4等)但是,问题在于检测到的音高是低于实际音高的半音(例如,C4应该是音符,但是显示D#4).
您认为可能有什么不对?如有必要,我可以发布代码.非常感谢!我还是开始掌握DSP的领域.
编辑:这是我正在做的粗略划痕
byte[] buffer = new byte[8192];
int bytesRead;
do
{
bytesRead = stream16.Read(buffer, 0, buffer.Length);
} while (bytesRead != 0);
Run Code Online (Sandbox Code Playgroud)
然后:(waveBuffer只是一个将byte []转换为float []的类,因为该函数只接受float [])
public int Read(byte[] buffer, int offset, int bytesRead)
{
int frames = bytesRead / sizeof(float);
float pitch = DetectPitch(waveBuffer.FloatBuffer, frames);
}
Run Code Online (Sandbox Code Playgroud)
最后:( Smbpitchfft是具有FFT算法的类...我相信它没有错,所以我不在这里发布)
private float DetectPitch(float[] buffer, int inFrames)
{
Func<int, int, float> window = HammingWindow;
if (prevBuffer == null)
{
prevBuffer = new float[inFrames]; //only contains zeroes
}
// double frames since …Run Code Online (Sandbox Code Playgroud) 我想知道样本块与其等效时间之间的关系.鉴于我目前的粗略想法:
每秒播放的样本数=总文件大小/持续时间.
所以说,我有一个1.02MB的文件,持续时间为12秒(平均),我将每秒播放大约89,300个样本.这是正确的吗?
还有其他方法可以计算这个吗?例如,我怎么知道一个字节[1024]数组与时间相当多少?
我试图理解FFT算法,到目前为止我认为我理解它背后的主要概念.但是我对'framesize'和'window'之间的区别感到困惑.
根据我的理解,它们似乎彼此多余?例如,我将一个帧大小为1024的样本块作为输入.因此我将字节[1024]作为输入.
那么窗口函数的目的是什么?从最初开始,我认为窗口函数的目的是从原始数据中选择样本块.
谢谢!
我在C#中使用FMOD.我已经尝试fmodex.dll通过选择Project-> Add Reference并浏览来导入文件fmodex.dll,但是我收到一个错误:
无法添加对...的引用.请确保该文件是可访问的,并且它是有效的程序集或COM组件
它是可访问的,但我仍然得到错误.我阅读了指南,它说使用fmodex_vc.lib链接到fmodex.dll文件时.所以我尝试,但我似乎无法找到如何链接到Visual Studio中的.lib文件; 搜索Google总是引导我链接到.dll文件.
任何人都知道可以用来从C#编写MusicXML数据的库吗?与此类似:http://proxymusic.kenai.com/(虽然这是针对java的).
我会尝试不手动编写,但如果情况更糟,我将别无选择,只能从我的结果中手动输出和编写MusicXML.
如何比较两个数组之间的相似性?说我有:
Base Array: [.5,0,0,0,.25,0,0,.25,0,0,0,0]
Array 1: [1,0,0,0,1,0,0,1,0,0,0,0]
Array 2: [0,0,1,0,0,0,1,0,0,1,0,0]
Array 3: [1,0,0,0,0,0,0,0,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)
关于上面的数组,答案应该是数组1.答案是数组1,因为数组元素在结构上"更接近"基数组的数组元素.与数组3不同,.25更接近1而不是0.另一个例子:
Base Array: [.75,0,0,0,0,0,0,0,.25,0,0,0]
Array 1: [1,0,0,0,1,0,0,1,0,0,0,0]
Array 2: [0,0,1,0,0,0,1,0,0,1,0,0]
Array 3: [1,0,0,0,0,0,0,0,0,0,0,0]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,阵列3应该是答案.
然而,使用我当前的算法(我将在稍后给出),答案变为数组3.这是我正在使用的:
for (int i = 0; i < basearray.Length; i++)
{
temp = (basearray[i] - arrayX[i]);
dist += temp * temp;
}
Run Code Online (Sandbox Code Playgroud)
所以,我认为我的算法出了问题?或许,我需要使用'不同'的算法而不是距离(因为基本上,.25 IS接近0比1,但我想要的是其他).
谢谢!
更新:
我找到了答案!感谢所有人的帮助.这里是:
float[] pbaseArrX = new float[3];
float[] pcompArrX = new float[3];
float dist1 = 0, dist2 = 0;
for (int i = 0; i < baseArrX.Count; i++) …Run Code Online (Sandbox Code Playgroud) 我是HTML的新手,我想知道是否存在除了蛮力使用空格创建以下示例表以外的有效方法:

我试过了,但是代码并不漂亮。非常感谢您的帮助和提示。
我在使用P/Invoke for C#时遇到了问题.这是我试图从.dll调用的函数(用C++编写):
string
BeatTracker::getName() const
{
return "Tempo and Beat Tracker";
}
Run Code Online (Sandbox Code Playgroud)
这是我尝试调用此函数的代码:
[DllImport("qm-vamp-plugins.dll",EntryPoint="BeatTracker")]
public static extern string getName();
public QMTempo()
{
Console.WriteLine(getName());
}
Run Code Online (Sandbox Code Playgroud)
什么似乎是错的?我收到BadImageFormatException.除了IDE给我的模糊名称之外,我怎么能知道未来参考文献中的错误?我顺便使用Visual Studio 2008.
我也在使用(但不确定是否正确)EntryPoint,让它知道我正在使用BeatTracker类中的getName函数(因为还有其他类的getName函数,它们包含在单个.dll文件中)
谢谢!
如果这看似重复,我道歉,但由于前一个问题似乎引起了一些混淆,这是另一回事.
我有2个基本数组:
float[] baseArr1 = new float[3] {0.430651724, 0.137407839, 0.177024469};
float[] baseArr2 = new float[3] {0.718210936, 0.001312795, 0.009634903};
Run Code Online (Sandbox Code Playgroud)
另外2个数组用于比较:
float[] compArr1 = new float[3] {1, 1, 1};
float[] compArr2 = new float[3] {1, 0, 0};
Run Code Online (Sandbox Code Playgroud)
然后将compArr1和compArr2与baseArr1和baseArr2进行比较.我知道我应该得到的答案,但我很难想出一个算法来得出答案.与baseArr1比较时,答案应该是compArr1,当与baseArr2比较时,答案应该是compArr2.
请注意,两个baseArrs的值不一定必须加起来1.另外,这里有两个更简洁的数组,试图让我的观点更加清晰:
float[] extraArr1 = new float[3] {.5, .3, .3};
float[] extraArr2 = new float[3] {.75, 0, 0};
Run Code Online (Sandbox Code Playgroud)
其中extraArr1与compArr1"接近",而extraArr2与compArr2"更接近".我已经尝试过一些人建议的余弦相似度算法,但有时候答案是不正确的.
标准是每个元素的价值"更多".例如,compArr1具有比compArr2更接近baseArr1的"更多"值,并且compArr2与baseArr2相比具有比compArr1更接近baseArr2的"接近度".
谢谢!
更新:
我得到了答案!我将在这里张贴以供将来参考,我承认我遇到了很多麻烦,也让其他人感到困惑,但也要感谢你帮我吧!这是我做的:
float[] pbaseArrX = new float[3];
float[] pcompArrX = new float[3];
float dist1 = 0, dist2 = 0;
for (int i = 0; …Run Code Online (Sandbox Code Playgroud) c# ×7
algorithm ×4
audio ×2
fft ×2
similarity ×2
alignment ×1
c++ ×1
correlation ×1
dll ×1
exception ×1
fmod ×1
guitar ×1
html ×1
html-table ×1
musicxml ×1
pinvoke ×1
pitch ×1
richtextbox ×1
sampling ×1
short ×1