Окно Хэмминга генерирует линию
У меня есть аудиофайл и я читаю все данные из буфера звуковой карты. Затем я конвертирую byte[]
в float[]
использовать их для окна Хэмминга. Форма волны аудио:
после использования окна Хемминга:
форма волны аудио с окном Хэмминга не так ли? Где моя ошибка?
кстати я использую библиотеку naudio для обработки аудио:
WaveChannel32 wave = new WaveChannel32(new WaveFileReader("sesDosyası.wav"));
byte []buffer = new byte[wave.length];
float []data = new float[wave.length / 4];
int read = wave.Read(buffer, 0, wave.length);
for (int i = 0; i < read / 4; i++)
{
data[i] = BitConverter.ToSingle(buffer, i * 4); //converting byte to float
chart1.Series["wave"].Points.Add(data[i]); //first waveform
}
for (int j = 0; j < read/4; j++)
{
data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (read / 4 - 1)));//hamming
chart2.Series["wave"].Points.Add(data[j]); //second waveform
}
2 ответа
Похоже, вы применяете окно ко всей волне, поэтому read
будет огромным, поэтому термин внутри cos
всегда будет очень близко к 0 для data
между [-1,1].
Таким образом, вы всегда получаете .54 - .46*cos(0)
знак равно .54 - .46*1.0
знак равно .08
Только из википедииj
должен быть внутри косинуса - это дает окно, которое вы затем умножаете на data[j]
:
window = 0.54 - 0.46 * Math.Cos( (2*Math.PI * j)/(total - 1) ).
hammed_signal = data[j]*window;
Почему вы пытаетесь применить окно Хэмминга ко всей волне?
Я думаю, что ваша линия Хэмминга не так
data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (read - 1)));
Как ваша петля идет от 0
в read/4
и вы делитесь на read
, так что если вы прочитали 16 образцов, ваш цикл for просматривает только первые 4, но делит на 15, а не на 3.
var total = read / 4;
for (int j = 0; j < total; j++)
{
data[j] = (float)(0.54 - 0.46 * Math.Cos((2 * Math.PI * data[j]) / (total- 1)));//hamming
chart2.Series["wave"].Points.Add(data[j]); //second waveform
}