Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Zdravím
- vytvořte aplikaci, která bude zpracovávát zvuk nahrávaného z mikrofonu v reálném čase. Zpracování zvuku bude probíhat v časové oblasti a výsledkem bude frekvenční spektrum. Zdrojový kód pro zachytávání zvuku zvukové karty je uložen v souboru Recorder.cs, kde jsou všechny potřebné metody okomentovány. Pro správnou funkčnost této třídy musíte do do projektu zakomponovat knihovnu NAudio.dll, která je také součástí přílohy. http://msdn.microsoft.com/en-us/library … 80%29.aspx
- algoritmus pro zpracování zvuku je libovolny, je však doporučeno použít algoritmus rychlé fourierovy transformace FFT, který je uložený v souboru FFT.cs, zde doporučuji použít metodu RealFFT()
- výsledek vykreslete do aplikace typu WinForm (Formulářová aplikace) - Doporučuji použít Microsoft.Chart komponentu, která je určena pro vykreslování grafů. http://www.microsoft.com/downloads/cs-c … 0ae6ea442c
- v aplikaci bude vykreslen jak původní signál tak spektrum do hlavního formulářového okna
- aplikace umožní detekci prahové hodnoty signálu - pomocí UpDown uživatelského prvku
- při detekci překročení prahové hodnoty dojde k vykreslení informace o překročení v určitém čase na obrazovku
- součástí přílohy je také třída, která vytváří druhé vlákno a používá v sobě synchronizaci pomocí třídy EventWaitHandle, což usnaďňuje poměrně velkou část řešení projektu, na studentovi tedy pouze zbývá tento kód pochopit a zakomponovat správně do svého uživatelského rozhranní.
http://czshare.com/2855804/P%C5%99%C3%ADlohy.zip
http://www.youtube.com/watch?v=fpwuqDVw … r_embedded
Offline
Můj postup:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
AnalyzerThread analyze = new AnalyzerThread();
Recorder rec = new Recorder();
public Form1()
{
InitializeComponent();
//změna rozsahu osy X1
chart1.ChartAreas[0].AxisX.Minimum = 0;
chart1.ChartAreas[0].AxisX.Maximum = 2000;
//změna rozsahu osy Y1
chart1.ChartAreas[0].AxisY.Minimum = -1;
chart1.ChartAreas[0].AxisY.Maximum = 1;
//změna rozsahu osy X2
chart2.ChartAreas[0].AxisX.Minimum = 0;
chart2.ChartAreas[0].AxisX.Maximum = 500;
//změna rozsahu osy Y2
chart2.ChartAreas[0].AxisY.Minimum = 0;
chart2.ChartAreas[0].AxisY.Maximum = 0.6;
}
//graf pro vykreslení zvuku v časové oblasti
public void vykresli(LinkedList<float> samples_measured)
{
foreach (float sample in samples_measured)
{
if (chart1.Series[0].Points.Count > 1000) // ptám se, zda-li řada vzorků neobsahuje více než 1000 vzorků, které chci zobrazit na ose X
chart1.Series[0].Points.RemoveAt(0); // odstranění vzorku z řady
chart1.Series[0].Points.AddY(sample); // přidávání dat do grafu
}
analyze.AddSamples(samples_measured.ToArray());
}
//graf pro vykreslení frekvenčního spektra (převzatá část od Blažeje Kuhajdy)
private double step_WK;
public void vykresli_fft(double[] samples_fft) // přichází pole s oboustranným FFT spektrem, proto níže /2 (stačí pouze jednostranné spektrum)
{
if (chart2.InvokeRequired) // zde se ptám, jestli je graf pro FFT volán z jiného vlákna, podmínka platí, když metodu volám z jiného vlákna
{
FFTSamplesProcessed new_handler = new FFTSamplesProcessed(vykresli_fft); // vytvářím nový objekt stejného typu, jak je událost, kde mám vypoč. FFT
this.Invoke(new_handler, new object[] { samples_fft }); // zde do nového objektu dám data, které posílá druhé vlákno a současně vyvolávám tuto metodu na vlákně, na kterém běží vykreslování
}
else
{
chart2.Series[0].Points.Clear(); // vymazání grafu
for (int i = 0; i < (samples_fft.Length / 2); i++)
{
chart2.Series[0].Points.AddXY((i * step_WK), samples_fft[i]); // vykreslování po bodech
}
}
}
//tlačítko pro uzavření aplikace
bool appRunning = false;
private void button1_Click(object sender, EventArgs e)
{
if (appRunning)
rec.StopRecording();
if (analyze.IsAnalyzerRunning)
analyze.Stop();
Application.Exit();
}
//tlačítko pro zastavení nahrávání
private void button2_Click(object sender, EventArgs e)
{
button2.Enabled = !button2.Enabled;
button3.Enabled = true;
chart1.Enabled = false;
}
//tlačítko pro spouštění nahrávání
private void button3_Click(object sender, EventArgs e)
{
button3.Enabled = !button3.Enabled;
button2.Enabled = true;
chart1.Enabled = true;
}
//tlačítko pro FFT
private void button4_Click(object sender, EventArgs e)
{
if (button4.Text == "START")
{
analyze.Start();
button4.Text = "STOP";
}
else
{
analyze.Stop();
button4.Text = "START";
}
}
//vybrané zařízení
private int mic_id = 0;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.mic_id = comboBox1.SelectedIndex;
}
//nastavení limitu
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
numericUpDown1.Maximum = 100;
numericUpDown1.Minimum = 0;
}
//zisk
private void progressBar1_Click(object sender, EventArgs e)
{
}
//napěťová špička
private void label1_Click(object sender, EventArgs e)
{
}
}
}P.S.: funkčnost 0!
Offline
Zdravím,
Ze zdrojového kódu se dá lecos vyčíst, ale v těch win forms aplikacích je to horší (chválím komentáře). Nejlepší bude, když někam uploaduješ celý projekt a my se na něho podíváme.
Offline