Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C#ă€‘éŸłćŁ°ă‚’æłąćœąćŒ–ă—ăŠéŸłćŁ°èȘè­˜ăƒ©ăƒłăƒăƒŁăƒŒă‚’äœœă‚‹ç‚șăźèš˜äș‹

Last updated at Posted at 2023-03-13

憅ćźčăŻă©ă†ă§ă‚‚ă„ă„ă‹ă‚‰ăšă«ă‹ăă„ă„ă­ă—ăŠăŠăăźăŒăŠă™ă™ă‚
ăă‚ăă‚æŹĄăźă‚’äœœă‚ă†ăšă„ă†äș‹ă§ăšă‚Šă‚ăˆăšćźŸèŁ…ă—ăŠăżăŸă™ă€‚

敏題はè‡Ș戆ぼ音棰ではブレがç™șç”Ÿă™ă‚‹ă‹ă‚‰ăŠăă‚‰ăäž€è‡Žă—ăȘいだろうべいうäș‹ă§ă€ă“たèŸșăźæ›–æ˜§äž€è‡ŽćźŸèŁ…ă‚’æ•°ć­Šçš„ă«è§Łæ±șしăȘくどはăȘă‚ŠăŸă›ă‚“ă€‚
かăȘり掄介だ....

ăŸăšăŻçŹŹäž€æź”éšŽăšă—ăŠć°€ă‚‚ć˜çŽ”ăȘćźŸèŁ…ă§è©Šă—ăŸă™ă€‚
最䜎限Windowsă§ć‹•ă‹ă›ă‚Œă°ă„ă„ă‹ă‚‰ćż…èŠăȘらPythonăšă‹äœżă†ă€‚

OxyPlotă‚’äœżăŁăŠăżăŸă—ăŸă€‚ćčžé‹ă«ă‚‚TeratailたèłȘć•ă§äœżăŁăŠăŸăźă‚‚OxyPlotă ăŁăŸăŸă‚ă€ă“ă‚Œă‚’äž€éƒšçœŸäŒŒă‚‹ă€‚ă“ă†ă„ă†ăźăŒăȘă„ăšç›žćœ“æ™‚é–“æŽ›ă‹ăŁăŠă—ăŸă†ăšæ€ă†ă€‚

ç›źæŹĄïŒˆé•·ăăȘăŁăŸăźă§ïŒ‰

1.才æș–ć‚™
2.éŸłćŁ°æłąćœąă‚’èĄšç€șする
3.ćźŸèĄŒç”æžœ
ă“ă“ăŸă§ăźæ‰‹é †ăźGIt挖
4.ハミングçȘ“ă‚’æŽ›ă‘ă‚‹
ă“ă“ăŸă§ăźGit Branch挖
5.ćż…èŠăȘæłąćœąăźé•·ă•ă‚’èšˆçź—ă§ć‰Čりć‡șす
6.äżć­˜ă•ă‚ŒăŸéŸłćŁ°æłąćœąăŒć…„ćŠ›ă—ăŸæłąćœąăšäž€è‡Žă™ă‚‹ă‹ă©ă†ă‹ćˆ€ćźš

1.才æș–ć‚™

ăƒžă‚€ă‚Żă‚’æș–ć‚™ă™ă‚‹ă€€ïŒˆæ›žăćż˜ă‚ŒïŒ‰
1000憆繋ćșŠăźUSBăƒžă‚€ă‚Żă‚’äœżăŁăŠă„ă‚‹ă€‚

OXyPlotă‚€ăƒłă‚čăƒˆăƒŒăƒ«

NugetでOxyPlot.Wpfă‚’æ€œçŽąă—ăŠă„ă‚Œă‚‹ă€‚
image.png

ăƒ‡ă‚¶ă‚€ăƒŠäžŠă§èĄšç€șă•ă›ă‚‹èš­ćźš

ä»„äž‹ă‚’ć‚è€ƒă«ă—ăŠ

EvryThing(https://www.voidtools.com/) ă§ăźă‚€ăƒłă‚čăƒˆăƒŒăƒ«ćŸŒæ€œçŽąç”æžœ
image.png

äœżă„æ–čはçȘ“ăźç€Ÿă§ă‚‚èŠ‹ăŠçœźă„ăŠă»ă—ă„ă€‚ă‚€ăƒłă‚čăƒˆăƒŒăƒ«æ™‚ă«æłšæ„ă™ă‚Œă°è‡Șć‹•çš„ă«ć…šăŠă‚€ăƒłăƒ‡ăƒƒă‚Żă‚čă•ă‚Œă‚‹ïŒˆäž‹èš˜ć‚ç…§ïŒ‰ă€‚
image.png

ćˆ€æ˜Žă—ăŸăƒ‘ă‚č

C:\Users\USER\.nuget\packages\oxyplot.wpf.shared\2.1.2\lib\net45\OxyPlot.Wpf.Shared.dll

C:\Users\USER\.nuget\packages\oxyplot.core\2.1.2\lib\net45\OxyPlot.dll

これら2ă€ă‚’ă‚„ă‚„æ‰‹é–“ă ă‘ă©ć‚ç…§ć…ˆă«æ‰‹ć‹•ă§èżœćŠ ă™ă‚Œă°ă„ă„ă€‚æ€œçŽąă§ăŻć‡șăȘい。
Visual studio 2022にお。
image.png

チェックボックă‚čăŒć€–ă‚Œă‚‹ăƒă‚°ă‚‰ă—ăă‚‚ăźăŒă‚ă‚‹ă€‚

ăƒ“ăƒ«ăƒ‰ă™ă‚‹ïŒˆæ›žăćż˜ă‚ŒïŒ‰

べりあえずć‡șる。
image.png

ć°šă€ăƒ„ăƒŒăƒ«ăƒœăƒƒă‚Żă‚čăźèĄšç€șはPlotViewである。
image.png

2.éŸłćŁ°æłąćœąă‚’èĄšç€șする

※NAudioもNugetă§ă‚€ăƒłă‚čăƒˆăƒŒăƒ«ă—ăŠăŠă„ăŠăă ă•ă„ă€‚

怋äșșblogăȘăźă ăŒæ€œèšŒă™ă‚Œă°ă™ă‚‹ă»ă©é©šăă»ă©æ­ŁçąșăȘCodeă ăšèš€ă†ăźăŒćˆ†ă‹ă‚‹ă€‚çœŸéąç›źăȘäșșだったらしい。

æź†ă©ăźCodingははおăȘblogăźćźŸèŁ…ăźăŸăŸă§ă»ăŒă‚łăƒłăƒ‘ă‚€ăƒ«ăŒé€šăŁăŠă—ăŸă†

ă‚‚ăĄă‚ă‚“ăăźăŸăŸă ăšErrorć‡șăŸăăŁăŠäœżă„ă‚‚ăźă«ăȘらăȘい。DataPointăźæ™‚ç‚čă§ă‚šăƒ©ăƒŒăŒć‡șた。
ćˆćżƒè€…ăƒŹăƒ™ăƒ«ă ăšă“ăźæ™‚ç‚čでèș“ăăšă“ă‚ă ă‚ă†ă€‚ă‚ăăŸă§WPFă‚’äœżăŁăŠă„ă‚‹ăźă§ăăźćŻŸćżœă‚’ă™ă‚‹ă‘ă©ă€æź†ă©äżźæ­Łăźćż…èŠăŒç„Ąă‹ăŁăŸăźă§ăĄă‚‡ăŁăšé©šă„ăŸăŁăŠè©±ă€‚

ă‚ăšăŻă‚°ăƒ©ăƒ•èĄšç€șăźăƒŽă‚Šăƒă‚Šă‚’æŠ•ć…„ă™ă‚‹ă ă‘ă ăŁăŸă€‚

DeviceNumber に぀いお

  waveIn = new WaveIn()
            {
               //Labelă«èĄšç€șされたDeviceChannelă‚’èš­ćźšă™ă‚‹ă€‚
               //0でいいらしい
                DeviceNumber = 0, // Default
            };

ć€–èŠł

â€»èŠçŽ æŻŽă«ă‚łăƒ”ăƒšă—ăŠăă ă•ă„

  <Grid>
        <StackPanel VerticalAlignment="Center" HorizontalAlignment="Left">
            <Button Content="Button" Margin="0,0,0,10"
                                 Height="40" Width="70" Click="Button_Click"/>
            <Button Content="Button" 
                                Height="40" Width="70" Click="Save_Click"/>
        </StackPanel>

        <Label VerticalAlignment="Top"
            Background="AliceBlue" Height="50" Width="700" x:Name="label1" />

        <oxy:PlotView 
             Model="{Binding oxyModel, ElementName=root}"
             Controller="{Binding Controller, ElementName=root}" 
            x:Name="plotView" HorizontalAlignment="Center" Margin="0,111,0,0" VerticalAlignment="Top" Height="270" Width="396"/>

    </Grid> 

æœŹcode

※CodeăŻäž€èĄŒăšă€æ€œèšŒă—ăȘがらコピペしどください。
※errorăŻćž‹ă«æłšæ„ă—ăȘăŒă‚‰äž€ă€ăšă€è§Łæ¶ˆă—ăŠă„ăŁăŠăă ă•ă„ă€‚
※ćčŸă€ă‹ăŻă‚łăƒĄăƒłăƒˆă”ăšä»–ăźèš˜äș‹ă‹ă‚‰æŒăŁăŠăăŠăŸă™ă€‚

using NAudio.Wave;
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;
using System.Collections.Generic;
using System.Linq;
using System.Windows;

namespace VoiceLancherTests
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            InitPlot();

        }

        WaveIn waveIn;
        public PlotController Controller { get; } = new PlotController();

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < WaveIn.DeviceCount; i++)
            {
                var deviceInfo = WaveIn.GetCapabilities(i);
                label1.Content = string.Format("Device {0}: {1}, {2} channels",
                i, deviceInfo.ProductName, deviceInfo.Channels);
            }
            

            waveIn = new WaveIn()
            {
                DeviceNumber = 0, // Default
            };
            waveIn.DataAvailable += WaveIn_DataAvailable;
            waveIn.WaveFormat = new WaveFormat(sampleRate: 16000, channels: 1);
             ///sampleRateは音棰èȘè­˜ç”šăźæłąćœąă«ćż…èЁăȘherz数 * 1000

            waveIn.StartRecording();           
        }

        private void WaveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
            // 32bită§æœ€ć€§ć€€1.0fă«ă™ă‚‹ïŒˆć…ƒèš˜äș‹ăźăƒžăƒžïŒ‰
            ///floatćž‹ă«ă—ă€ă€æœ€ć€§1.0fă«ćˆ¶é™ă™ă‚‹
            for (int index = 0; index < e.BytesRecorded; index += 2)
            {
                short sample = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]);
             ///'<<'ăŻć·Šă‚·ăƒ•ăƒˆæŒ”çź—ć­ă§ă‚ă‚‹ïŒˆćˆă‚ăŠèŠ‹ăŸïŒ‰
             ///e.Bufferはbyte枋ぼ配戗
             ///8 ăƒ“ăƒƒăƒˆă‚·ăƒ•ăƒˆă™ă‚‹ăš2た8äč—ă‚’æŽ›ă‘çź—ă—ăŸæ•°ć€€ă«ăȘる
             ///ăȘぜ8ăƒ“ăƒƒăƒˆă‚·ăƒ•ăƒˆăȘăźă‹ïŒŸ16bit Shiftă«ă—ăŸă‚‰æłąćœąăŒæœ°ă‚ŒăŸïŒˆçŽ°ă‹ă™ăŽïŒ‰

                float sample32 = sample / 32768f;
                               ///'f'はfloată‚’èĄšă™
                             ///32bit Floatăšé–ąé€ŁïŒŸ
                            ////shortćž‹ăźäž‹é™ïŒˆă‚ă‚‹ă„ăŻäžŠé™ïŒ‰ă§ć‰Čる
////16ăƒ“ăƒƒăƒˆïŒš -32,768  32,767
/// https://pspunch.com/pd/article/bit_depth/
                ProcessSample(sample32);                
            }
        }
        List<float> _recorded = new List<float>(); // éŸłćŁ°ăƒ‡ăƒŒă‚ż

        private LineSeries _lineSeries = new LineSeries();
        // OxyPlotăźăŸă‚ăźăƒąăƒ‡ăƒ«ăšă‚łăƒłăƒˆăƒ­ăƒŒăƒ©ăƒŒ
        public PlotModel oxyModel { get; } = new PlotModel();
        // è»žăźèš­ćźš
        public OxyPlot.Axes.LinearAxis AxisX { get; } = new OxyPlot.Axes.LinearAxis();
        public OxyPlot.Axes.LinearAxis AxisY { get; } = new OxyPlot.Axes.LinearAxis();

        private void ProcessSample(float sample)
        {                  
            _recorded.Add(sample);

            if (_recorded.Count == 1024)
            {
                var points = _recorded.Select((v, index) =>
                        new DataPoint((double)index, v)
                    ).ToList();

                _lineSeries.Points.Clear();
                _lineSeries.Points.AddRange(points);
                
                plotView.InvalidatePlot(true);

                _recorded.Clear();
            }        

        }
        void InitPlot()
        {
            var model = new PlotModel();

              model.Axes.Add(new LinearAxis { Minimum = -0.1, Maximum = 0.1, Position = AxisPosition.Left, });
            model.Series.Add(_lineSeries);
            plotView.Model = model;
        }

        private void Save_Click(object sender, RoutedEventArgs e)
        {
            waveIn.StopRecording();

            ///Save recoded Data to CSV            
        }
    }
}

ăȘぜ8ăƒ“ăƒƒăƒˆă‚·ăƒ•ăƒˆć€‰æ›ă™ă‚‹ăźă‹ă«ă€ă„ăŠăźChatGPTă«ă‚ˆă‚‹è§ŁèȘŹ

ćźŸćœšă™ă‚‹ăƒ‰ă‚­ăƒ„ăƒĄăƒłăƒˆăŻćˆ†ă‹ă‚ŠæŹĄçŹŹèš˜èŒ‰ă—ăŸă™ă€‚

ăƒă‚€ăƒˆé…ćˆ—ă§ć—äżĄă—ăŸéŸłćŁ°ăƒ‡ăƒŒă‚żă‚’16ăƒ“ăƒƒăƒˆăźă‚·ăƒ§ăƒŒăƒˆćž‹ă«ć€‰æ›ă™ă‚‹ăŸă‚ă«ćż…èŠă§ă™ă€‚ć·Šă‚·ăƒ•ăƒˆæŒ”çź—ăŻă€ăƒă‚€ăƒˆćž‹ăźäž‹äœăƒ“ăƒƒăƒˆă‚’ă‚·ăƒ§ăƒŒăƒˆćž‹ăźäžŠäœăƒ“ăƒƒăƒˆă«ç§»ć‹•ă•ă›ă‚‹ă“ăšă«ă‚ˆăŁăŠă€8ビットから16ăƒ“ăƒƒăƒˆăžăźć€‰æ›ă‚’ćźŸçŸă—ăŸă™ă€‚ăă—ăŠă€ăăźćŸŒă€shortćž‹ăźă‚”ăƒłăƒ—ăƒ«ă‚’-32768から32767ぼ範ć›Čăźæ”źć‹•ć°æ•°ç‚čæ•°ă«æ­ŁèŠćŒ–ă™ă‚‹ăŸă‚ă«ă€32768でć‰Čă‚‹ć‡Šç†ăŒèĄŒă‚ă‚ŒăŠă„ăŸă™ă€‚ă“ă‚Œă«ă‚ˆă‚Šă€ć…„ćŠ›éŸłćŁ°ăŒ-32768から32767ぼ範ć›Čă§èĄšă•ă‚Œă‚‹ă‚·ăƒ§ăƒŒăƒˆćž‹ăƒ‡ăƒŒă‚żă§ă‚ăŁăŸć Žćˆă§ă‚‚ă€æ­ŁèŠćŒ–ă•ă‚ŒăŸć‡ș抛が-1.0から1.0ぼ範ć›Čă§èĄšă•ă‚Œă‚‹ă‚ˆă†ă«ăȘă‚ŠăŸă™ă€‚

3.ćźŸèĄŒç”æžœ

image.png

æ„ć€–ăšCodingぼ難ćșŠăŻäœŽă‚ă€‚
ChartèĄšç€șăŸă§ăźăƒŽă‚Šăƒă‚ŠăŒćˆ†ă‹ă‚‰ăȘă„ăšè‹ŠćŠŽă—ăŸăšæ€ă†ă€‚

chartăŒèĄšç€șされăȘい栮搈

OxyPlotがăȘい。
ăƒžă‚€ă‚ŻăŒæ­Łćžžă«æŽ„ç¶šă•ă‚ŒăŠăȘい。
ăƒžă‚€ă‚ŻăŒä»–ăźă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă«ă‚ˆăŁăŠæŽ’ä»–ćˆ¶ćŸĄă•ă‚ŒăŠă„ă‚‹
PlotViewăźćˆæœŸćŒ–ăŒć‡șæ„ăŠă„ăȘい
çŸŠăƒăƒ„ăƒŒăƒăƒŒăźć‹•ç”»ă‚’èŠłăŠă„ăȘい

こぼèŸșă‚Šă‚’äž€ă€äž€ă€ăƒă‚§ăƒƒă‚Żă—ăŸă—ă‚‡ă†ă€‚

æłąćœąăƒ‡ăƒŒă‚żăŒăĄă‚ƒă‚“ăšæ„ăŠă„ă‚‹ă‹çąșèȘă™ă‚‹ă€‚

ăƒ–ăƒŹăƒŒă‚Żăƒă‚€ăƒłăƒˆă‚’æŽ»ç”šă—ăŸă—ă‚‡ă†ă€‚
ăăźèĄŒăźæ™‚ç‚čではpointsはnullăźăŸăŸă§ă™ă€‚

image.png

ă“ă“ăŸă§ăźæ‰‹é †ăźGIt挖

ăƒ—ăƒ­ă‚žă‚§ă‚Żăƒˆăƒ•ă‚Ąă‚€ăƒ«ă§ă™ăŒă€Visual Studio2022 .net7ă‚’äœżăŁăŠă„ăŸă™ă€‚
ä»ŠćŸŒă‚‚ăȘるăčăæœ€æ–°ăźç’°ćąƒă‚’äœżă„ăŸă™ă€‚ć€ăăȘったらăƒȘクスă‚čăƒˆæŹĄçŹŹă§æ›Žæ–°ă—ăŠăŠăăŸă™ă€‚

 git Clone https://github.com/Sheephuman/VoiceLancherTests.git

URLă ă‘ă§è©Šă—ăŸă‘ă©ă‚„ăŁă±ă‚Š.gitćż…èŠă ăŁăŸä»¶ă€‚

ă“ăźćŸŒăźæ‰‹é †ă‚’Branchしど戆けるăȘă©ăźæ–œç­–ă‚’è©Šăżă‚ˆă†ăšæ€ă†ă€‚

4.ハミングçȘ“ă‚’æŽ›ă‘ă‚‹

ハミングçȘ“ăȘă«ăă‚ŒçŸŽć‘łă—ă„ăźïŒŸ 的ăȘæ„Ÿă˜ă§äžèŠă ă‚ă†ăšæ€ăŁăŠèŠă‚ŒăȘかったんですが、èȘżăčăŸă‚‰éŸłćŁ°è§Łæžă‚’ćźčæ˜“ă«ă™ă‚‹ă‚‚ăźă‚‰ă—ăă€ç›źæŒ‡ă™ä»•æ§˜ă«ć‘ă‘ăŠćż…èŠăȘćźŸèŁ…ă ă‚ă†ăšă„ă†äș‹ă§ă“ă‚Œă‚’èżœćŠ ă—ăŸă™ă€‚

è©łçŽ°ăȘèȘŹæ˜Ž

ć Žćˆă«ă‚ˆăŁăŠăŻäžĄç«ŻăźèŠçŽ ăŒă‚Œăƒ­ă«ăȘるべいうハニングçȘ“ă‚’äœżă†ăčăă‹ă‚‚çŸ„ă‚ŒăȘい。

Math.NET NumericsをNugetă§ă‚€ăƒłă‚čăƒˆăƒŒăƒ«ă—ăŸă™ă€‚

HamingçȘ“èĄšç€ș甹ぼChartă‚’ćˆ„ă«ç”šæ„ă—ăŸă™ă€‚
image.png

ćˆæœŸćŒ–ç”šăźInitPlotă‚’ćŒ•æ•°ă‚’ć–ă‚‹ă‚‚ăźă«æ”čé€ ă—ăŸă™ă€‚

void InitPlot
   void InitPlot(LineSeries _lineSeries, PlotView _plotView )
            {
                var model = new PlotModel();


       ///ć†…éƒšă‚łăƒłăƒˆăƒ­ăƒŒăƒ«ćˆ€ćźš
           if (_plotView.Name == hammingPlotView.Name)
            {
                model.Axes.Clear();
                model.Axes.Add(new LinearAxis { Minimum = 0, Maximum = 10000, Position = AxisPosition.Bottom });
                model.Axes.Add(new LinearAxis { Minimum = 0, Maximum = 4, Position = AxisPosition.Left, });
            }

                model.Series.Add(_lineSeries);
                _plotView.Model = model;
}

////コンă‚čăƒˆăƒ©ă‚Żă‚ż
 public MainWindow()
            {
                InitializeComponent();

                InitPlot(_lineSeries,plotView);
                InitPlot(_hammingLineSeries, hammingPlotView);
            }

HammingçȘ“甚たSeriesïŒˆçł»ćˆ—ïŒ‰ăšăƒąăƒ‡ăƒ«ă‚’ç”šæ„ă—ăŸă™ă€‚

 ////Field for Haming Window 
 private LineSeries _hammingLineSeries = new LineSeries(); 
 public PlotModel hammingOxyModel { get; } = new PlotModel();

HammingçȘ“ç”šăźăƒĄă‚œăƒƒăƒ‰ă‚’äœœæˆă—ăŸă™

èłȘć•ă™ă‚‹ăŸă§ă‚‚ăȘくかăȘり簡捘だった。
ă‚łăƒĄăƒłăƒˆă«ă‚ˆă‚‹ăšWindowSizeăšăŻæłąćœąăƒ‡ăƒŒă‚żfloat<List>ăźă‚«ă‚ŠăƒłăƒˆïŒˆèŠçŽ æ•°ïŒ‰ă‚’æŒ‡ă™ă‚‰ă—ă„


 List<DataPoint> HammingMethod()
        {
           var window = MathNet.Numerics.Window.Hamming(_recorded.Count);
           ///ăăźăŸăŸă ăšWinFormăšăźæ›–æ˜§ć‚ç…§ă‚’è”·ă“ă™ïŒˆă‚ă‚“ă©ă„ïŒ‰
 
           var haming_recorded = _recorded.Select((v, i) => v * (float)window[i]).ToList();

            Complex[] complexData = haming_recorded.Select(v => new Complex(v, 0.0)).ToArray();
           ///è€‡çŽ æ•°é…ćˆ—ăƒ‡ăƒŒă‚żă«ć€‰æ›

            Fourier.Forward(complexData, FourierOptions.Matlab); // arbitrary length                             
           /// ăƒ•ăƒŒăƒȘă‚šć€‰æ›ă—ăŸć‡Šç†ă‚’èż”ă™

            var s = haming_recorded.Count * (1.0 / 16000.0);
        ///èŠçŽ æ•°ă«ïŒˆ1 / Hertzæ•°ïŒ‰ă‚’æŽ›ă‘ă‚‹ïŒˆă“ăźć ŽćˆăŻ16kHz
        ///これをしăȘいべDataPointă«ćż…èŠăȘè§ŁćƒćșŠă‚’ćŸ—ă‚‰ă‚Œăšă€æłąćœąăŒæœ°ă‚Œă‚‹

            var point = complexData.Take(complexData.Count() / 2).Select((v, index) =>
                  new DataPoint((double)index / s,
            Math.Sqrt(v.Real * v.Real + v.Imaginary * v.Imaginary))
            ).ToList();
        ////æłąćœąăƒ‡ăƒŒă‚żăźćčłæ–čæ čă‚’èšˆçź—
        ////Enumerable.Take ăƒĄă‚œăƒƒăƒ‰ (System.Linq) 
       ////ă‚·ăƒŒă‚±ăƒłă‚čăźć…ˆé ­ă‹ă‚‰èŠçŽ ă‚’èż”ă™

            this.hammingPlotView.InvalidatePlot(true);            return point;
        }

これをProcessSampleăƒĄă‚œăƒƒăƒ‰ć†…ă§ćźŸèĄŒă—ăŸă™ă€‚

  private void ProcessSample(float sample)
        {
            _recorded.Add(sample);
            if (_recorded.Count == 1024)
            {////省畄}           
                _lineSeries.Points.Clear();
                _hammingLineSeries.Points.Clear();

                _lineSeries.Points.AddRange(points);
                _hammingLineSeries.Points.AddRange(HammingMethod());

                plotView.InvalidatePlot(true);
                hammingPlotView.InvalidatePlot(true);

                _recorded.Clear();
            }
        }

ă“ă“ăŸă§ăźćźŸèĄŒç”æžœ

ă“ă“ăŸă§ăźGit Branch挖

ä»„ć‰ăźCodeは
git clone https://github.com/Sheephuman/VoiceLancherTests.git
ă§ăăźăŸăŸć–ćŸ—ă§ăăŸă™ă€‚

Git
git clone -b HammingWindow_Branch https://github.com/Sheephuman/VoiceLancherTests.git

5.ćż…èŠăȘæłąćœąăźé•·ă•ă‚’èšˆçź—ă§ć‰Čりć‡șす

これは捘ăȘă‚‹èšˆçź—ăźć•éĄŒă§ă€ć€šćˆ†ć€§ć­Šć…„ă‚Œă‚‹äșș繋ćșŠăȘă‚‰ă™ăèšˆçź—ć‡șæ„ă‚‹ăšæ€ă†ă‚“ă ă‘ă©ăŸă‚ăšă‚Šă‚ăˆăšèȘżăčおć‰Čりć‡șă™ă€‚ă‚«ăƒăŒæŽ›ă‹ă‚‰ăȘくどいい。

ăŸăšćźŸéš›ă«éŒČéŸłă«ćż…èŠăȘç§’æ•°ăšéŸłćŁ°èȘè­˜ă«é©ă—ăŸă‚”ăƒłăƒ—ăƒ«ăƒŹăƒŒăƒˆă‹ă‚‰ă€ćż…èŠăȘăƒ‡ăƒŒă‚żăźé•·ă•ă‚’ć‰Čりć‡șす。éŒČéŸłă«äœżç”šă™ă‚‹ăƒ‡ăƒŒă‚żăŻă‚čăƒˆăƒƒăƒ—ă‚Šă‚©ăƒƒăƒă§èšˆæžŹă—ăŸăšă“ă‚2秒5ç§’ăšă„ăŁăŸăšă“ă‚ïŒˆćŻŸè±Ąăźă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłćă‹ăăźäž€éƒšă‚’ć‘Œăčă°ă„ă„ïŒ‰

音棰èȘè­˜ă«é©ă—ăŸă‚”ăƒłăƒ—ăƒ«ăƒŹăƒŒăƒˆăŻ16khzで捁戆べぼこべ。
â€»ćŸŒæ—„ă‚ˆă‚ŠçČŸćșŠă‚’䞊げるç‚șに32khză«ć€‰ăˆăŸă‚Šă—ăŠăŸă™ă€‚

 16(khz) * 1000 * 5(秒) = 80000plot数

ă“ăźæ•°ă«ćŻŸă—ăŠ2たăčきäč—ă«æœ€ă‚‚èż‘ă„è‡Șç„¶æ•°ă‚’ć‰Čりć‡șă™ïŒˆé«˜é€Ÿăƒ•ăƒŒăƒȘă‚šć€‰æ›-FFTは2たăčきäč—でăȘいべć‡ș杄ăȘă„ăšă„ă†ćˆ¶é™ăŒă‚ă‚‹ă€€-ć‚è€ƒïŒšhttps://cognicull.com/ja/f5q2jl62
 ChatGPTたWeb版みたいăȘć‡șć…žäžæ˜ŽăźèŹŽă‚”ă‚€ăƒˆă€€ïŒ‰

é–ąæ•°é›»ć“ă«ă‚‚æ…Łă‚ŒăŸă‹ăŁăŸăŒäœżă„æ–čがよく戆からăȘかった。

é©ćœ“ă«C#ă«ć€‰æ›ă—ăŠ

 private void Calc_Click(object sender, RoutedEventArgs e)
        {
            int n = 80000;
            string bin = Convert.ToString(n, 2); 
            int len = bin.Length;
            Debug.WriteLine(len - 1); 
        }

甐果 : 16

仄䞊から2た16äč—ăȘいし17äč—ă‚’äœżç”šă™ă‚Œă°ă‚ˆă„ă“ăšă«ăȘる。

ćŸ—ă‚‰ă‚ŒăŸæ•°ăŻ655365秒æœȘæș€ïŒ‰ă§ă‚る。

ă“ă‚Œă»ă©ăźèŠçŽ æ•°ăšăȘるべかăȘりchartèĄšç€șが重くăȘăŁăŠă—ăŸă†ăŒă€€é‡ă„ăšă„ă†ă‚ˆă‚Šć‰Čりć‡șă—ăŸæłąćœąăźé•·ă•ă§ă‚ă‚‹4秒~5ç§’ćŒ±æŻŽă«ăȘっどるらしい。音棰èȘè­˜ăƒ©ăƒłăƒăƒŁăƒŒă‚’äœœă‚‹ăźăŒç›źçš„ăȘぼで敏題ăȘいだろう。

image.png

CSV挖

ç”æ§‹äŸżćˆ©ăȘ蚘äș‹ăŒă‚ăŁăŸă‚“ă§èŒ‰ă›ăšăă€‚éžćŒæœŸăƒĄă‚œăƒƒăƒ‰ăšă‹IDisposableăŸă§ćźŸèŁ…ă—ăŠă‚ă‚‹ăźăŒç”šæ„ăŒă„ă„ă€‚

6.äżć­˜ă•ă‚ŒăŸéŸłćŁ°æłąćœąăŒć…„ćŠ›ă—ăŸæłąćœąăšäž€è‡Žă™ă‚‹ă‹ă©ă†ă‹ćˆ€ćźš

æș€ă‚’æŒă—ăŠăźæ›Žæ–°ă€‚é‡Žè‰Żä»•äș‹ăšäœ“èȘżäžè‰Żă§ăȘかăȘă‹äœœæ„­ć‡ș杄ăȘかった。
ć†’é ­ă«ă‚‚æ›žă„ăŸă‘ă©äž€è‡ŽăŻïŒˆć€šćˆ†ïŒ‰100ïŒ…ă—ăŸă›ă‚“ă€‚äž€è‡ŽçŽ‡ă‚’æ•°ć€€ăšă—ăŠć‡șă™ă‚‚ăźă‚’èŠ‹ă€ă‘ăŸăźă§ăă‚Œă‚’è©Šă—ăŠăżă‚ˆă†ăšă„ă†é …ă§ă™ă€‚

wildpieăźæ—„èš˜(https://wildpie.hatenablog.com/entry/2014/10/13/122909 )ă«ă‚ă‚ŠăŸă—ăŸă€‚æ„ŸèŹă—ă‹ăȘă„ă§ă™ă­ă€‚ć€šćˆ†ă“ă“ăă‚‰ă„ă—ă‹ăȘいぼで。

ćźŸèĄŒç”æžœăźèš˜éŒČ蚘äș‹

蚘äș‹ć†…ă§èŠçŽ æ•°ă‚’ç”žă‚ŠèŸŒă‚€ćŻŸç­–ă‚’æ–œă—ăŸă—ăŸïŒˆćźœă—ă‘ă‚Œă°ă‚čăƒˆăƒƒă‚Żă—ăŠăă ă•ă„ïŒ‰ă€‚

äž€ćżœæˆćŠŸă—ăŠăŸă™ăźă§ă€ă“ă‚Œă§æŹĄć›žăŻæŒ‡ćźšăźă‚ąăƒ—ăƒȘă‚±ăƒŒă‚·ăƒ§ăƒłă‚’è”·ć‹•ă•ă›ă‚‹ăšă“ăŸă§ăŻèĄŒă‘ăŸă™ă€‚ă“ăźăŸăŸă ăšăƒŽă‚€ă‚șç­‰ăźćœ±éŸżă§MinDistanceç”æžœăŒćź‰ćźšă—ăȘいようăȘăźă§ă€æŹĄć›žæ›Žæ–°ă§ăŻăƒ­ăƒŒăƒ‘ă‚čăƒ•ă‚Łăƒ«ă‚żăźćźŸèŁ…ă‚’è©Šăżă‚‹äșˆćźšă§ă™ïŒˆă„ă„ă­ăšă‹ćą—ăˆăȘい栮搈はblogç­‰ă«è»ąèŒ‰ă•ă›ăŠé ‚ăăŸă™(笑)ïŒ‰ă€‚

Gir Branch挖

漟はăƒȘポゾトăƒȘăŒä»„ć‰ăźăŸăŸæ›Žæ–°ă•ă‚ŒăŠăȘă‹ăŁăŸăźă§ïŒˆćœ“ç„¶äœœæ„­ć†…ćźčăŻç„Ąă«ćž°ă—ăŸïŒ‰ă€é©ćˆ‡ăȘ操䜜æ–čæł•ă‚’èŠšăˆăŸă†ăˆă§Comită—ç›Žă—ăŸă—ăŸă€‚é™łèŹă€‚

git clone -b  BPMatching_Brunch https://github.com/Sheephuman/VoiceLancherTests.git 

testæžˆăżă§ă™ă€‚
ここではCSVäżć­˜ăŻăŸă èĄŒă‚ăšă€ăƒ’ăƒŒăƒ—ă«çąș保されたListăźé…ćˆ—ăšăăźăŸăŸæŻ”èŒƒă—ăŠă„ăŸă™ă€‚
敏題ç‚čăŻèšˆçź—ă«æ™‚é–“ăŒæŽ›ă‹ă‚ŠéŽăŽă‚‹ïŒˆRyzen7 3700xで35ç§’ă‹ă‹ă‚‹ïŒ‰äș‹ă§ă€æ”čć–„ă‚’è©ŠăżăŠă„ă‚‹ăšă“ă‚ă§ă™ă€‚
→6ç§’ć‰ćŸŒăŸă§çŸ­çžźă€‚
ă‚łăƒĄăƒłăƒˆæ­“èżŽă€‚
Pythonă§èĄŒă†æ–čæł•ăŻă„ă„ă­ăŒćą—ăˆăŸă‚‰è©Šă—ăŸă™ă€‚

æłąćœąă«ăƒ•ă‚Łăƒ«ă‚żă‚’æŽ›ă‘ă‚‹

ć‡șćŠ›ç”æžœăŒćź‰ćźšă—ăȘă„ăźă§ăƒ­ăƒŒăƒ‘ă‚čăƒ•ă‚Łăƒ«ă‚żă‚’æŽ›ă‘ăŸă™ă€‚

æłąćœąă‚’äżć­˜ă—ăŠăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚č挖する

ăŸă ă“ă‚Œăšă„ăŁăŸæ‰‹æź”ă‚„ă‚ąă‚€ăƒ‡ă‚Łă‚ąăŻăȘă„ă‚“ă§ă™ăŒă€ăƒ•ă‚Ąă‚€ăƒ«ă‚”ă‚€ă‚șがかăȘă‚Šè‚„ć€§ćŒ–ă™ă‚‹äș‹ăŒäșˆæƒłă•ă‚ŒăŸă™ă€‚
ă“ă‚Œă«ćŻŸă™ă‚‹æ–œç­–ăšă—ăŠă€ăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚č登éŒČæ™‚ă«idăȘă©ă‚’ä»˜ćŠ ă—ăŠăăźăŸăŸLinkするæ–čćŒă‚’ć–ă‚‹äș‹ă«ă—ăŸă™ă€‚ă“ă‚Œă«ă‚ˆă‚Šăƒ‡ăƒŒă‚żăƒ™ăƒŒă‚čăźć…šæłąćœąă‚’ç…§ćˆăȘどずいうäș‹ăŻéżă‘ă‚‰ă‚ŒăŸă™ă€‚

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

@EndOfData's pickup articles

EndOfData

@EndOfData(ăƒ€ăƒžă‚”ă‚­ ă‚”ăƒ•ă‚©ăƒŒă‚Ż)

ć„łæ€§ăšăƒ’ăƒ„ă‚žă‚’ă“ă‚ˆăȘăæ„›ă™ă‚‹ăƒ’ăƒ„ă‚žăƒ‹ă‚ąă€‚ ă„ă„ă­ć‹Ÿé›†äž­ă€‚æŠ•é™ćŸŒă€äž€ćčŽé–“ă„ă„ă­ä»˜ă‹ăȘă‹ăŁăŸèš˜äș‹ăŻæ¶ˆă—ăŸă™ ă„ă„ă­ă•ă‚ŒăŸèš˜äș‹ăŻćŠ ç­†ă‚’æ€œèšŽă—ăŸă™ă€‚ æœ€èż‘ăŻWPFă—ă‹è§ŠăŁăŠăȘいèȧäčæš‡ăȘă—çŸŠă€‚ â€»ćœ“ă‚ąă‚«ă‚Šăƒłăƒˆă§ăŻćźšæœŸçš„ă«èš˜äș‹ăźăƒĄăƒłăƒ†ăƒŠăƒłă‚čă‚’èĄŒăŁăŠăŠă‚ŠăŸă™ă€‚ ă„ă„ă­ăŒćą—ăˆă‚‹ă»ă©èš˜äș‹ăźć“èłȘăŻäžŠăŒă‚ŠăŸă™(ć‡șæ„ă‚‹çŻ„ć›Čで)

Today's trending articles

ăăźä»–æŠ€èĄ“ Qiita Tech Festa 2025
sigma_devsecops

Kent Beckæ°ăźèŹ›æŒ”ă‚°ăƒƒăƒ‰ăƒăƒŒăƒˆăźæł•ć‰‡ăŻă‚‚ăŁăšæ‚ČèŠłçš„ă«æ‰ăˆă‚‹ăčăă ăŁăŸă‚’èžă„ăŠăźæ„ŸæƒłăŸăšă‚ #開ç™șç”Ÿç”Łæ€§con_findy

Linked from these articles

Comments

No comments

Let's comment your feelings that are more than good

Being held Article posting campaign

OS Qiita Tech Festa 2025

2025-06-17 ~ 2025-07-15

View details
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address