Matematické Fórum


1. 8. 2026 (L) Fórum bude brzy uzavřeno 😿

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