ブログ

割とコンピュータよりの情報をお届けします。

コンピュータ

Python numpyでFFTを実行する.周波数軸はどうしたら4

前の記事ではnumpy.fft.fftfreqをプロットの時の範囲指定に使うことしか考えていなかったが,フィルタなどもできる.

numpy.fft.fftfreqによって生成した周波数軸とnumpy.whereを使うと周波数でフィルタリングが行える.
例えば,
Fzf = np.fft.fft(z);
Fz2f = np.where(np.abs(freq2) > 12, 0, Fzf)
などとすれば,周波数成分を取り除くことができる(0で埋めることができる).
np.fft.ifftで時間領域の信号に戻せば0で埋めた成分は消えている.

import numpy as np
import matplotlib.pyplot as plt

# 例の信号を作成
t = np.linspace(0.001, 4, 1000);
z = 0.1 + 0.2 * np.sin(t * 10 * 2 * np.pi) + 0.2 * np.sin(t * 33 * 2 * np.pi);

# サンプリング周波数
fsmp = 1 / (t[1] - t[0]);
# 解析時間
t_len = t.max() - t.min();

Fzf = np.fft.fft(z); # Fzfはfftした結果
Fz = Fzf / z.shape[0] * 2; # 折り返すのでパワーが2分の1になっている.
Fz[0] = Fz[0] / 2; # 平均成分は折り返さない.
Fz_abs = np.abs(Fz);


freq2 = np.fft.fftfreq(len(t), d=1.0/fsmp);# 周波数軸の生成

# abs(freq2)が12以上の成分をカット
Fz2f = np.where(np.abs(freq2) > 12, 0, Fzf) # filter
z_filtered = np.fft.ifft(Fz2f);
Fz2 = Fz2f / z.shape[0] * 2;
Fz2[0] = Fz2[0] / 2;
Fz2_abs = np.abs(Fz2);


plt.figure(1)
# 比較FFTプロット
plt.subplot(211);
plotrange = np.where(freq2 >= 0)
plt.plot(freq2[plotrange], Fz_abs[plotrange]);
plt.plot(freq2[plotrange], Fz2_abs[plotrange]);

# 比較波形プロット
plt.subplot(212);
plt.plot(t, z);
plt.plot(t, z_filtered);

plt.savefig("valuestar.work.177.png")

plt.show();


≫ Read More

2021/04/03 コンピュータ   TakeMe
Tag:Python

「場所が利用できません」ダイアログ

買ったばかりの外付けSSDで昨日の朝「場所が利用できません」ダイアログが出るようになってしまった.

買ったばかりのUSB接続の外付けSSDを使い始めて3日目の出来事だった.
ダイアログの中身は「D:\にアクセスできません。 ファイルまたはディレクトリが壊れているため、読み取ることができません。」で,エクスプローラにドライブのアイコンは見えていて,ドライブ文字も割り当てられている.
スタートメニューの「Windows 管理ツール」の「コンピュータの管理」「ディスクの管理」で対象のドライブがNTFSでなくRAWになっていることを確認した.

「エラー チェック」もできない(D:のプロパティの「ツール」タブから)。この時点では,「エラーチェック」できない場合には「CHKDSK」も使えないと勝手に思っていた。
焦っていると何も考えられない。「NTFS」が「RAW」になっているから「NTFS」と認識させるだけでよいだろうと,「TestDisk」を使用してみていたが,うまくいかない.どうも理由は違ったらしい。

CHKDSK /F D:

で不具合は一応消えた。(怖いのでいったんリカバリツールでバックアップを取ってから)まだ使い始めたばかりの記憶装置だったから被害の範囲を覚えていたが,ある程度使った状態で起こると怖いな.

今回の教訓は「D:\にアクセスできません。 ファイルまたはディレクトリが壊れているため、読み取ることができません。」というダイアログの表示の場合には「TestDisk」で修正できる内容ではない可能性が高い.

≫ Read More

2021/04/01 コンピュータ   TakeMe

Python numpyでFFTを実行する.周波数軸はどうしたら3

以前の記事「Python numpyでFFTを実行する.周波数軸はどうしたら」「Python numpyでFFTを実行する.周波数軸はどうしたら」ではlinspaceを使って周波数リストを出力していたのをnumpy.fft.fftfreqでもよいと書いていたが,,,

numpy.fft.fftfreqで作る次のようなコードではfreq2は途中でいきなり負に飛ぶことになり,plt.plot(freq2, Fz_abs);とするとプロットが汚くなる.xlimで範囲制限をしても枠外の点とつながった線が気になる.

import numpy as np
import matplotlib.pyplot as plt

# 例の信号を作成
t = np.linspace(0.001, 4, 1000);
z = 0.1 + 0.2 * np.sin(t * 10 * 2 * np.pi) + 0.2 * np.sin(t * 33 * 2 * np.pi);

# サンプリング周波数
fsmp = 1 / (t[1] - t[0]);
# 解析時間
t_len = t.max() - t.min();

Fz = np.fft.fft(z) / z.shape[0] * 2; # 折り返すのでパワーが2分の1になっている.
Fz[0] = Fz[0] / 2; # 平均成分は折り返さない.
Fz_abs = np.abs(Fz);

freq = np.linspace(0, fsmp - 1.0/(t_len + t[1] - t[0]), num=len(t));
freq2 = np.fft.fftfreq(len(t), d=1.0/fsmp);

plt.figure(1)
plt.plot(freq, Fz_abs);

plt.figure(2)
plt.plot(freq2, Fz_abs);
plt.xlim([0, 125])


plt.show();

たとえば,np.where(freq2 >= 0, freq2, np.nan)で選別してもよい.要素がNaNになっているとプロットに失敗するので描画されない(plt.figure(3)に示した).
もしくは,np.where(freq2 >=0)でインデックス列の状態にしておいてそれでプロット範囲を周波数で制限することも可能でplt.figure(4)に示した.

import numpy as np
import matplotlib.pyplot as plt

# 例の信号を作成
t = np.linspace(0.001, 4, 1000);
z = 0.1 + 0.2 * np.sin(t * 10 * 2 * np.pi) + 0.2 * np.sin(t * 33 * 2 * np.pi);

# サンプリング周波数
fsmp = 1 / (t[1] - t[0]);
# 解析時間
t_len = t.max() - t.min();

Fz = np.fft.fft(z) / z.shape[0] * 2; # 折り返すのでパワーが2分の1になっている.
Fz[0] = Fz[0] / 2; # 平均成分は折り返さない.
Fz_abs = np.abs(Fz);

freq = np.linspace(0, fsmp - 1.0/(t_len + t[1] - t[0]), num=len(t));
freq2 = np.fft.fftfreq(len(t), d=1.0/fsmp);

plt.figure(1)
plt.plot(freq, Fz_abs);

plt.figure(2)
plt.plot(freq2, Fz_abs);
plt.xlim([0, 125])

freq3 = np.where(freq2 >= 0, freq2, np.nan)
plt.figure(3)
plt.plot(freq3, Fz_abs);

plt.figure(4)
plotrange = np.where(freq2 >= 0)
plt.plot(freq2[plotrange], Fz_abs[plotrange]);

plt.show();

≫ Read More

2021/03/30 コンピュータ   TakeMe
Tag:Python

WebView2ランタイムで音声読み上げ Vol. 2

WebView2なら音声読み上げを入れることができる.SAPIの代わりに使いたい場合には動的にJavaScriptを実行するようにならないといけないな。と思って修正.

SAPIの代わりに使う場合には,WebView2.CoreWebView2.ExecuteScriptAsyncを使えばよい.
例えとして下にサンプルを示す.
ただし,この例では毎回var synthes = new SpeechSynthesisUtterance()とやっているので注意して.オーバーヘッドが大きい.
もともとWindows 10の場合にはすでにSAPIがあるので読み上げ機能を使うだけでやるのは意味はない.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            string path = Directory.GetCurrentDirectory();

            path = path + @"\\index.html";

            this.webView21.Source = new Uri(path);
        }

        private async void button1_Click(object sender, EventArgs e)
        {
            string text =
                "var synthes = new SpeechSynthesisUtterance('こんにちは');" +
                "speechSynthesis.speak(synthes);";
            await this.webView21.CoreWebView2.ExecuteScriptAsync(text);
        }
    }
}


WebView2.CoreWebView2.ExecuteScriptAsyncがつかえるのはページを読み終わって表示し終わってからだと思う.その前に実行すると例外が発生すると思う.

SAPIだけでやる場合には以下のように行うのです.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            SpeechLib.SpVoice sp = new SpeechLib.SpVoice();
            sp.Speak("アレクサ。今なんじ");
        }
    }
}

≫ Read More

2021/03/27 コンピュータ   TakeMe

WebView2ランタイムで音声読み上げ

昔はCefSharpで試していたが,今度はWebView2ランタイムで読み上げを試してみる。(いまCefSharpがどうなっているのかは知らない)

例えばindex.htmlを作って以下のように書いておくと「こんにちは」と読み上げてくれるようになった。

<html>
<head>
    <script>
        var synthes = new SpeechSynthesisUtterance('こんにちは');
        speechSynthesis.speak(synthes);
    </script>
</head>
<body>
    TEST
</body>
</html>

Windows 10でこれができるのは当たり前でしかもSAPIも標準で使用できるのでわざわざ読み上げだけを使いたいときにWebView2ランタイムを使うことはないが,Windows 7でもこれができるなら便利である。
Windows 7では標準で読み上げできないから...WebView2ランタイムが操るMicrosoft Edgeの力を借りて読み上げを実装する ということ...

≫ Read More

2021/03/21 コンピュータ   TakeMe

CefSharpよりWebView2が標準に移っていくのか?

前にWebBrowserコントロールがあまりに古いのでCefSharpを使うということでアプリを作っていたが,ようやくWebView2がやってきたらしい。

.NET Frameworkでアプリを作っているとWebアプリの要素を取り込みたくなることがある。
ところが,WebBrowserコントロールはInternet Explorerの機能を使用しているのでなかなか新しい機能を盛り込んだWebアプリの機能の仕様が難しかった。

そのため,今のところCefSharpを使っている(1)(2)(3)...等。

ところが,WebView2を使えば割と新しいWebブラウザの機能(Edge)が使用できる。
WebView2ランタイムをインストールした上で,Visual Studioのプロジェクト側ではnugetでWebView2をインストールする。

「Edgeが必要なので当面は古いWindows Embedded Standard 7デバイスの保守向け対応では使えない。ますますWindows 10向けの開発は楽になり,古いシステムへの対応が難しくなる。」
と思っていたが,一応WebView2ランタイムはWindows 7およびWindows 8も対応らしい
ただし,各バージョンのWindows用のEdgeのインストールが必要である。Windows 10以外向けのMicrosoft Edgeは昨年から配信が始まっている。

≫ Read More

2021/03/21 コンピュータ   TakeMe

ZXing.netでQRコード遊び

ちょっと古いネタだけどQRコードにどれだけ文字を詰められるのかを調べていたら,nugetでないかなーと調べたらQRCoderというのが先に出てきて試していたが,オーバーフローしても何も出てこない。

Zxing.Netがの方が作り込まれている。これが一番簡単な例。

だいぶん前にQRコードを使うために使用したけど,忘れていた。そのため最初にQRCoderを使っていたがなかなか使い勝手が悪い。通常の長さの文字列なら問題ないが長くなってくるとスマホで読まなくなる現象が発生。
結局前に使ったのはどんなバーコード作成ライブラリだったのかを調べてZXingだった。そして参考ページを探した。
ZXing.NETをnugetで入れて,例えば,以下のように使用する。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ZXing;

namespace ZxingTEST
{
    public partial class Form1 : Form
    {
        private BarcodeWriter qrcode;
        public Form1()
        {
            InitializeComponent();

            qrcode = new BarcodeWriter
            {
                Format = BarcodeFormat.QR_CODE,
                Options = new ZXing.QrCode.QrCodeEncodingOptions
                {
                    ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.Q,
                    CharacterSet = "UTF-8",
                    Height = 320,
                    Width = 320,
                    Margin = 2
                }
            };
        }

        private void button1_Click(object sender, EventArgs e)
        {
            pictureBox1.Image = qrcode.Write(this.textBox1.Text);
        }
    }
}

QRCoderではオーバーフローがどうなっているのか不明だが,ZXing.NETでは例外が返るようになっていた。正しく伝達できるかは、読み取り側のソフト次第だが日本語も書き込みできる。

≫ Read More

2021/03/21 コンピュータ   TakeMe

Wix Toolsetでパスが存在したらインストール先を変更する方法

Wix Toolsetを使ってインストーラを作成していたら,Product要素内で<UIRef Id="WixUI_Mondo" />を追加してFeature要素のConfigurableDirectory属性に"INSTALLFOLDER"などインストールするディレクトリIdを指定しているとインストール中にインストール先を指定することができるようになる。
<Property Id="INSTALLFOLDER" Value="L:\Program Files"/>などにしていればデフォルトインストール先を変えることもできるが,L:\がない場合にはインストーラそのものが異常終了してしまう。

この時の変更するのは
<Property Id="INSTALLFOLDER" Value="L:\Program Files"/>
の置き換えである。次のようになる。

        <Property Id="DIRECTORYEXISTS">
            <DirectorySearch Id="CheckFileDir" Path="L:\" Depth="0" AssignToProperty="yes"/>
        </Property>
        <SetProperty Id="INSTALLFOLDER" After="AppSearch" Value="L:\Program Files">DIRECTORYEXISTS</SetProperty>

L:\があるかどうかを確認してそれをDIRECTORYEXISTSに格納する。その結果をもとにしてINSTALLFOLDERを設定しなおす。

このようにしておくと,L:\が存在すればL:\Program Filesがインストールディレクトリになるけどない場合にも異常終了に至ることはない。

≫ Read More

2021/03/14 コンピュータ   TakeMe

WPF 文字列の入ったResourceDictionary.xamlファイルをテキストファイルのまま同梱する方法

WPFのResourceDictionaryに文字列を追加することも可能らしい.
ResourceDictionaryを記述するxamlファイルは,普通はビルドの時にアッセンブリファイルにくっつける。
このとき,WPFのリソースを提供する場合にはxamlファイル(テキストファイル)のまま提供することもできるみたい。

ResourceDictionaryを記述するxamlファイルは,テキストファイルのまま同梱できるらしいのだ。

Xaml_file_as_a_textfile_buildaction.png

xamlファイルのビルドアクションをコンテンツに直して出力ディレクトリにコピーする。

そして,例えばリソースに以下のように追加するだけ。
(この場合には出力ディレクトリをルート(/)として/Resoures/Resources.xamlにコピーされるファイルをResourceDictionaryとして読み込み)

<Window.Resources>
        <ResourceDictionary Source="/Resources/Resources.xaml" />
    </Window.Resources>

ウインドウのリソースに書いているとウインドウが生成されると時に読まれる。
このようにしておくとビルド環境がない場合にも文字列だけはその場でなおせる(かな)。
※文字列だけでなく,通常のResourceDictionary.xamlの記述内容なら変更可能なので言語によって文字列を変えるだけでなく言語を変えたところ同じ意味を表す文字列の長さが変わった場合にそれを収めるBorderのサイズを変えるとか文字サイズを変えるとか絵やアイコンをかえるとかも一応可能

画像ファイルについては単独でアッセンブリファイルに同梱できる。 以下の例では/Resouces/sample1.pngにファイルを入れている。

            <TextBlock Text="{DynamicResource test_string1}">
                <TextBlock.Background>
                    <ImageBrush ImageSource="/Resources/sample1.png"/>
                </TextBlock.Background>
            </TextBlock>

≫ Read More

2021/03/13 コンピュータ   TakeMe
Tag:WPF

Windows Forms用のVisual Studio データソース構成ウィザード

Windows Formsのアプリケーションを作っていて,データバインディングを使ってみたが,Visual Studio データソース構成ウィザードはAny CPU構成しか対応していないかもしれない。

ある日,Windows Formsのアプリケーションを作っていて,データバインディングを使ってみた。
x64用限定にしようと思って,構成マネージャでx64構成を作成してプロジェクトのプロパティを変更していた。

Visual Studio データソース構成ウィザードでx64構成ではオブジェクトが一覧に出てこない。

やり方を間違えたかと思ってうろうろしていたが,結局ウィザードがみているのはAny CPU設定の時の標準の出力パス bin\Debugやbin\Release ディレクトリ。
そこにオブジェクトがないといけないようだ.
(普通そんなこと気付くかな)

対象プラットフォームだけをx64にしている場合には出力パスは変化しないので問題にならない(はず)。構成マネージャでx64を新規作成してそれを選択した状態でビルドすると時々起こる.

≫ Read More

2021/02/27 コンピュータ   TakeMe