Matematické Fórum

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

#1 11. 04. 2012 21:39 — Editoval Tomas.P (22. 05. 2012 21:21)

Tomas.P
Příspěvky: 648
Reputace:   22 
 

C# program 2

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

 

#2 11. 07. 2012 21:18 — Editoval Tomas.P (30. 12. 2012 11:40)

Tomas.P
Příspěvky: 648
Reputace:   22 
 

Re: C# program 2

Můj postup:

Code:

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

 

#3 14. 07. 2012 15:48 — Editoval RePRO (14. 07. 2012 15:49)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: C# program 2

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.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#4 27. 12. 2012 21:11

Tomas.P
Příspěvky: 648
Reputace:   22 
 

Re: C# program 2

Jsem začátečník!

Offline

 

#5 29. 12. 2012 23:26

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: C# program 2

Kam jsi pokročil Tomáši?


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#6 15. 02. 2013 17:04

Tomas.P
Příspěvky: 648
Reputace:   22 
 

Re: C# program 2

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson