Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
99 / 95 / 9
Регистрация: 09.04.2010
Сообщений: 746
1

Как определить с высокой точностью момент времени максимального уровня шума

10.07.2011, 14:15. Показов 2608. Ответов 7
Метки нет (Все метки)

Допустим есть wav-запись, в котором максимальный уровень шума происходит чере 3.868 секунды.
Как это можно определить используя шарп?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2011, 14:15
Ответы с готовыми решениями:

Как определить координату x0 точки в начальный момент времени;
Уравнение движения точки имеет вид x = 400−0,6t Пользуясь уравнением, выполнить следующее: 1)...

Как найти точки пересечения. с высокой точностью до двух заков после запятой
Вот например есть набор значений(рандомно): х1=(1 2 3 4 5 6 7) у1=(15 14 25 35 36 85 45) и ...

Ослабление уровня шума
Рассчитайте ослабление уровня шума в точке R (для трёх значений RF) при прохождении поезда за счёт...

Определить ускорение частицы в момент времени
Частица совершает колебания по закону x = 30 10-2 cos(1,5 t), м. Определить ускорение частицы в...

7
12 / 12 / 4
Регистрация: 18.10.2010
Сообщений: 59
10.07.2011, 17:35 2
По идее просто разбиваешь WAV по сэмплам и смотришь, в котором наибольший уровень шума. Могу скинуть кое-какие наработки в этом вопросе.
Разбив WAV на отдельные семплы конвертишь каждый сэмпл (или один канал сэмпла) побитово в целове число, потом ищешь максимальное целое из всех и вычисляешь, в какой момент времени оно было.

Добавлено через 6 минут
Bytes 20- 21: Bytes per sample. 1 for 8 bit mono, 2 for 8 bit stereo or
16 bit mono, 4 for 16 bit stereo.
В заголовке wav Файла содержится информация о качестве звука, насколько понимаю, в целое нужно конвертировать либо 8 бит, либо 16, в зависимости от качества.

Добавлено через 4 минуты
Ну и, соответственно, используя бинарный ридер, пропускаешь заголовок в 44 байта, считываешь всё остальное в байтовый массив, и конвертируешь по 1 или 2 байта за раз в целые.
1
12 / 12 / 4
Регистрация: 18.10.2010
Сообщений: 59
11.07.2011, 22:27 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections;
using System.IO;
 
namespace WavAmpl
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        byte[] buffer = new byte[4];//Будем с его помощью переводить байты в int
        ArrayList Amp = new ArrayList(1000);//Будем хранить значения амплитуды звука 
        int volume = 0;//Будем использовать для хранения каждого 2400 сэмпла
        int currentVolume = 0;//Вспомогательный элемент
        private void btn_open_Click(object sender, EventArgs e)
        {
            Amp.Clear();//очищаем массив от предыдущих данных
            OpenFileDialog sh = new OpenFileDialog();//выбираем файл
            sh.Filter = "wav Files|*.wav";//Фильтр - только wav файлы
            sh.ShowDialog();
            if (sh.FileName != "")//Если выбран какой-нибудь файл
            {
                FileStream fs = new FileStream(sh.FileName, FileMode.Open, FileAccess.Read);
                fs.Seek(44, SeekOrigin.Begin);//Перематываем 44 байта от начала файла - заголовок
                bool end = false;
                while (!end)
                {
                    for (int i = 0; i < 2400; i++)
                    {//Берём каждый 2400 сэмпл, или 20 сэмплов в секунду для файла с качеством
                     //звука 48000
                        if(fs.Read(buffer, 0, 4) == 4)//Считываем 4 байта в buffer
                        {//если кол-во считанных байт меньше 4, значит, найден конец файла, заканчиваем чтение
                            currentVolume = BitConverter.ToInt16(buffer, 0);
                            if (volume < currentVolume)//Из 2400 берём самое большое значение,
                                volume = currentVolume;//чтобы случайно не пропустить пик
                        }
                        else 
                        {
                            end = true;
                            break;
                        }
                    }
                    Amp.Add(volume);//Добавляем в массив
                    volume = 0;//Обнуляем
                }
                
            }
            Amplitude.Width = Amp.Count;//подгоняем ширину графика под кол-во данных
            Bitmap bmp = new Bitmap(Amplitude.Width, Amplitude.Height);//создаём в оперативной памяти новый рисунок
            Graphics gr = Graphics.FromImage(bmp);
            Pen RedPen = new Pen(Color.Green, 1);
            for (int i = 0; i < Amp.Count; i++)
            {//рисуем наш график
                gr.DrawLine(RedPen, i, bmp.Height, i, bmp.Height - bmp.Height * Convert.ToInt32(Amp[i]) / 32767);
            }
            Amplitude.Image = bmp;
        }
    }
}
Пример. Для 16 бит стерео, для других форматов, думаю, разберётесь, если что.
Да, ещё нюанс, в данном случае мы считываем за раз значения обоих каналов (4 байта), но берём в рассмотрение только левый (2 байта).
0
Вложения
Тип файла: zip WavAmpl.zip (78.5 Кб, 150 просмотров)
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 5
30.05.2012, 22:09 4
Скажите пожалуйста как это сделать на языке java?

Добавлено через 1 минуту
Очень при очень нужен код, помогите пожалуйста.
0
12 / 12 / 4
Регистрация: 18.10.2010
Сообщений: 59
30.05.2012, 23:19 5
Arishka, во-первых, преочень, хотя такого слова и нет)
Во-вторых, завтра могу попробовать набросать завтра-послезавтра, если не забуду, давно собирался переписать на Java, руки не доходят всё.
Если нужно быстрее, не стесняйтесь пробовать сами)
0
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 5
31.05.2012, 01:05 6
Дело в том, что я C# не знаю.
0
12 / 12 / 4
Регистрация: 18.10.2010
Сообщений: 59
01.06.2012, 21:34 7
Arishka, он от Java не так сильно отличается.
0
Почетный модератор
21294 / 9028 / 1081
Регистрация: 11.04.2010
Сообщений: 11,015
01.06.2012, 23:06 8
Цитата Сообщение от Arishka Посмотреть сообщение
Скажите пожалуйста как это сделать на языке java
Здесь не будет обсуждаться Java. Обратитесь в соответствующий раздел
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2012, 23:06

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Определить скорость точки в момент времени
Помогите пожалуйста, если ответ, нужно решение. Заранее спасибо Материальная точка массой m = 11...

Определить скорость точки в момент времени t=10
Материальная точка массой m=900кг движется по горизонтальной прямой под действием силы F=270t,...

Определить скорость точки в момент времени
Определить скорость точки в момент времени, когда радиус кривизны траектории \rho = 5 м,...

Определить ускорение тела в момент времени
Пожалуйста срочно нужно решить задачку. Радиус - вектор материальной точки задан уравнением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.