yProcessingClub

すみません、許してください

たいらんくんVTuber化計画 進捗報告

yuri-processing-club.hatenablog.com

 

たいらんくんVTuber化計画ということで、アバターを作成中である。

完成には程遠いが、進捗報告をさせていただく。

 

f:id:Yuri-Processing-Club:20180516202446p:plain

まず最初に作成した全身。

ロリっぽい感じを目指しており、イカ腹の実装を頑張った。

 

顔についてはもちひよこ先生のモデリング講座を参考にした。

youtu.be

 

 

 

f:id:Yuri-Processing-Club:20180516202523p:plain

頭身を縮める。

(腕が長すぎるが、腕の造形はまだ行っていないので無視していただきたい。)

自分が作りたいと思っていたのと違う感じ。

ロリキャラが作りたかったのに、成人女性のデフォルメキャラが出来てしまった的な。

 

今まで(顔以外は)我流で作ってきたが、行き止まり感が出てきたので、

「やわらか3DCG教室」という、メタセコイアモデリング入門書を購入した。

この本に従い、人体を作り直し。

 

なお、こちらの本では私が作っているようなローポリと、表紙に出ている三つ編み巨乳のハイポリキャラ、そしてハイポリキャラを流用して作成した褐色男性キャラ(表紙奥側)の3種類のキャラクターの作り方が載っている。

 

f:id:Yuri-Processing-Club:20180516204432p:plain

関節のモデリングはこのような感じ。

この辺はきちんとした作法があるようで、我流で作ると後工程で詰むっぽい。

 

 

f:id:Yuri-Processing-Club:20180516203603p:plain

このようになった。

色分けについては書籍に従った。

 

 

f:id:Yuri-Processing-Club:20180516204547p:plain

手のモデリング

こちらも書籍の通りに作った。

中指~小指が繋がっているのも書籍の通り。

ローポリなのでこのくらいでいいと思う。

5本指とも独立させる場合は人差し指~中指の造形を流用すればいいので、

アップグレードもそんなにインパクトは無い。

 

f:id:Yuri-Processing-Club:20180516204048p:plain

顔も作り変えた。

目を丸っこくして、睫毛をシャープにした。

アニメのキャラっぽく、そしてロリっぽい感じに仕上がった。

 

 

 

f:id:Yuri-Processing-Club:20180516202620p:plain

髪の毛を生やした。

ツインテについては仮置きとしてキモい棒状のものとなっているが、

個性?ということでこのままにするのも良いかもしれない。

 

髪の色については色々試している。

 

f:id:Yuri-Processing-Club:20180516205851p:plain

頭頂部がペッタリしてたので、上方向の髪の毛のボリュームを増やした。

 

 

f:id:Yuri-Processing-Club:20180516204831p:plain

服を着せる。

どのようなデザインにするかは検討中。

 

 

f:id:Yuri-Processing-Club:20180516204919p:plain

頭の装飾を取り付ける。

ツインテ根元部分の固定具である。

正面からはネコミミ+リボン、横から見るとメカっぽいかっこいいやつになるというスンポーである。

 

 

f:id:Yuri-Processing-Club:20180516205345p:plain

個人的にはかなり可愛く造形出来ていると思う。

 

 

 

以上、進捗である。

ここまででかかった時間は10日ほどである。

3Dモデリングは初挑戦であるが、割と早く進んでいる気がする。

今月中にはボーンを入れて動かすところまで行きたい。

 

 

 

yuri-processing-club.hatenablog.com

次の記事はこちら。

4Kテレビを視聴してきた 55X9500E, 55X9000E, 58Z810X, 55BZ710X レビュー

簡易レビュー

自分用のメモ。限界日本語なのは気にしない。

某家電量販店にて、4Kテレビを視聴してきた。

簡単にレビューをば。


視聴したのは
Sony 55X9500E
Sony 55X9000E
東芝 58Z810X
東芝 55BZ710X
の4つ。

X9500EとX9000Eの比較

 ノイズ処理の性能は9500のほうが優秀であった。青空の雲の様子など、9500はクリアに表示していたのに対して、9000はノイズが発生していた。9500のデノイズ性能は素晴らしいが、Z810Xと9500のノイズ処理性能を比較した場合、どちらが優れているかは未確認。

 色表現の良さは店頭で普段流れているヨーロッパの町並みの映像ではあまり違いが無いように感じたが、FF15?のBDを再生してもらったところ、9500のほうが良く感じた。9500は色の数が多いような印象。自然で、"作られた鮮やかさ感"はあまりない。

 明暗がはっきりしているシーン(黒背景にSONYのロゴが表示されるシーン)は9500のほうが良く見えた。9500はクッキリとロゴを表示できていたのに対して、9000はバックライトの光がロゴの周辺に漏れていた。9500はエッジ型バックライト、9000は直下型バックライトであり、9500は原理上明暗の表現が苦手なはずであるが・・・?9500は「Slim Backlight Drive+」という謎の技術によってエッジ型なのに飛び地を明るく出来るそうで、とはいえ9000の直下型には及ぶまいと考えていたが、おそらく9000はエリア分割数が少ないのだろう。とにかく、9500を選ぶ上での最大の懸念事項はこれ(バックライトがエッジ型である点)であったので性能が良くて安心した。ただし深くは検証できていない。明るい店内での比較だしね。暗室で見比べたいところ。

 

Z810XとX9500Eの比較

 パシフィックリムが流れていたのでそれで比較した。9500は光陰の表現がかなり鋭く、暗闇を進むロボットのライトなどがかなーり明るく(眩しいと感じるレベル)表示されており、「つややかで上質な輝きのある映像を実現する高輝度技術「X-tended Dynamic Range PRO(エクステンディッド ダイナミックレンジ プロ)」(公式サイトより)」の凄さを実感させられた。Z810Xは9500と比べると輝きの表現は和らいでいる。(後述するが、Z810Xのきらめき表現は控えめ。)

 人物の肌表現に大きく違いがあり、9500はコントラスト高めで白めで明るい感じ、Z810Xはこってり濃い目な感じ。どちらがいいとかは好みによると思う。9500も別に白飛びしているとかではない。Z810Xはパナソニックプラズマテレビの色作りを思い出した。

  9500は高輝度技術「X-tended Dynamic Range PRO」を積極的に使っており、ややもすればわざとらしい印象を受けた。Z810Xも似た技術で「きらめき復元」が搭載されているが、効果はかなり消極的というか、ぶっちゃけあまり効果が実感できなかった。

 

Z810XとBZ710Xの比較

 東芝の販売員に聞いたが、BZ710XはIPS液晶。Z810XはVA液晶。VAのほうが性能良し。Z810Xはクリアブラックパネル(ハイコントラストブラックパネル)を使用しており、これはBZ710Xだけでなく9500にも9000にも搭載されていない(ちなみに東芝の下位モデルM510Xはクリアブラックパネルが搭載されている)。外光がパネルに乱反射することにより黒色が白っぽく映ってしまう件についてはZ810Xが最も優秀である。

 Z810X及びBZ710Xはどちらも直下型バックライトのエリアコントロールであるが、エリア分割数はZ810Xのほうが多いそうである。当然分割数が多いほうが有利。(東芝と比較するとソニーは分割数が少ないそうだが、東芝販売員の言うことなので話半分ということで)

 倍速機能については東芝はあるモデルからドラスティックに性能改善されたように感じるが、ソニーのぬるぬる感は出せていない。いや、「クリアスムーズ」モードに設定するとぬめぬめになるが、破綻が盛大に発生するので使い物にならない。「インパルス」モードにすると破綻も無く残像感は無くなるがが画面がチラチラするので微妙~。「クリア」モードは破綻も無く残像感も少な目でちょうどいい塩梅。ただしソニーのほうが優秀だと思う。(ちなみにシャープアクオスの16倍速液晶は破綻が少なくてソニーよりも性能が良く感じた。じっくり比較はしていないので、要検証。)

 

その他

 ソニーはリモコンの反応速度が激遅。アンドロイドTVになってトロトロになったみたい。ソニーに慣れてると東芝のメニュー画面のキビキビした動作に感動してしまう。

 遅延はX9500Eが最悪っぽい(海外勢の検証だと4K入力で20ms、1080p入力で40msらしい。ゲームモードでの測定かは不明 https://www.youtube.com/watch?v=mBD9ivZPvPc )。ゲームやるなら0.83msのZ810Xか。(応答速度0.83msってなんだよゲーミングモニタでも1msとかだぞ)

 X9500Eの音質は全く興味無いのでスルーした(ホームシアターシステム組んでるので・・・)。X9500Eご自慢の磁性流体スピーカーは音質よりもむしろ取り外せるかが気になったが、どうやら取り外せるっぽい。

まとめ

 自分が買うならX9500Eだねぇ。きらめき表現の良さが非常に気に入った。価格コムで調べると現在(2018年4月)の最安値は55X9500Eは19万円、55X9000Eは15万円。4万円ほど価格差があるが、55X9500Eの19万円も普通に安いレベルなので買いでしょ。

 皆にオススメできるのはZ810X。画質はX9500E同様に非常に高いレベルで文句のつけようがないし、タイムシフトマシンも凄い。メニュー画面の反応速度やゲームモードとか、全体的な完成度が高い。58インチなので55インチより若干でかくて得した気分になるし(?)

 そしてX9000EとBZ710Xも普通に買い。どっちも直下型バックライト(エリアコントロール)だし、BZ710Xに至ってはZ810Xと同じ画像エンジン積んでるし言うことないでしょ。

 

 

 

matlab argmin, argmaxを計算する

matlabにてargminやargmaxを計算する.
やり方としては非常に簡単.
minとmax関数を使う.

[min_val, min_ind] = min(y);
[max_val, max_ind] = max(y);

と書くと,min_ind,max_indにyが最小値,最大値となる時のインデックスが入る.

終わり!閉廷!





簡単な例で確認

例として

y = 2(x-5)^2+3
のargminを計算してみる.
(最小値はy=3で,argminはx=5である.)

上の式をmatlabで書くと,

x = 0:0.1:10;
y = 2*((x-5).^2)+3;

% グラフを描く
plot(x, y)
xlabel('x');
ylabel('y');
title('y=(x-5)^2+3');

グラフを描くと以下の通り.
f:id:Yuri-Processing-Club:20180130192705p:plain

この関数のargminを求める.



matlab標準のminを使った例

% テスト用関数の用意
x = 0:0.1:10;
y = 2*((x-5).^2)+3;

% argminを求める
[y_min, ind] = min(y);

% 結果の表示
fprintf('最小値はy[%d] = %f\n', ind, y(ind)); 
fprintf('argminはx[%d] = %f\n', ind, x(ind)); 

実行結果

最小値はy[51] = 3.000000
argminはx[51] = 5.000000

となり,無事にargminが求まった.



手で書いてみた例

% テスト用関数の用意
x = 0:0.1:10;
y = 2*((x-5).^2)+3;

% argminを求める
ind = 1;
min_val = inf;
for itr = 1:length(y)
    if(y(itr) < min_val)
        min_val = y(itr);
        ind = itr;
    end
end

% 結果の表示
fprintf('最小値はy[%d] = %f\n', ind, y(ind)); 
fprintf('argminはx[%d] = %f\n', ind, x(ind)); 

実行結果

最小値はy[51] = 3.000000
argminはx[51] = 5.000000

となり,こちらも無事にargminが求まった.



結論

とくになし.
matlab標準のmin関数で最小値が複数ある場合はどういう処理になるの?とか,
多次元配列のargminはどうなの?とかはドキュメントを読むと分かる.




参考
配列の最小要素 - MATLAB min - MathWorks 日本

調布祭に行くなどした

2017年11月25日、母校の電気通信大学の学園祭「調布祭」に行ってきた。

 

久々に調布を訪れたのだが、駅前が栄えていてたまげた。

写真には撮っていないが、ビックカメラがオープンしていた。

 

 

電通大はお変わりないようで。

 

 

テキトーに屋台のクレープなんかを食べる。

 

目的は学園祭そのものというより、大学時代の友達と会うことにあった。

友達と合流したので大学を早々に後にし、ご飯を食いに行く。

3人とも1ポンドステーキを頼む。味はまぁまぁという感じだった。 

 

 

ご飯屋さんを探していて、ラーメン屋「そらまめ」が閉店していたことを知って若干悲しむ。

「そらまめ」は知り合いの間では好評であった。(自分としてはそこまで美味しいとは思わなかったが・・・)

 

 

 

久々に会った友達はこの後サークル?のOB会に参加するというので離脱し、残った二人で秋葉に行った。

 

この友達とはよく秋葉に遊びに行くが、毎回特に何をするということも無くただステーキを食って終わりなのである。

この日はすでに調布でステーキを食べたので本当に何もせず解散した。何で秋葉に行った?

 

 

 

池袋のジュンク堂へ。

 

もともとジュンク堂に行く予定だったのだが、遠方に就職してなかなか会えない友達が調布祭に来てたというので急遽予定を変更したのである。一人になったので本来の予定を回収していく。

 

 

 

 信号処理の超基礎的な本とベイズ統計の本を買った。

せっかく来たんだしもっと色々回りたかったが、体力が限界で目眩がしてきたので退散。

 

 

 ジュンク堂の近くのスシローで晩飯。

 

 

疲れたけど楽しかった(こなみ)

 

味奈登庵 富士山盛り

味奈登庵 富士山盛り。 麺は1kgだそうである。

天ぷらもつけたので相当なボリュームだと覚悟していたが、 神豚の大豚ダブルなど日常的に食べている身からすると余裕であった。

蕎麦や天ぷら自体のクオリティも悪くなく、普通に美味しかった。

http://www.minatoan.com/menu/menu_ss/ss_main/ss_main.html

肉饂飩とみ坂 ピリ辛冷やし肉うどん

うまかったー

量がまったくもって足りないのでお店のハシゴ不可避であった。

食べログはここ↓
https://tabelog.com/kanagawa/A1401/A140101/14062998/

matlab スペクトログラム 周波数軸および時間軸方向に切り取る

2022/03/29 追記:重大なバグを発見した.
[~, freq, time, ps] = spectrogram(z,Nw,Nol,NFFT,Fs,'yaxis');
とあるが,psは確率密度関数なのでspectrogramの結果を使用していない.
[s, freq, time, ~] = spectrogram(z,Nw,Nol,NFFT,Fs,'yaxis');
としてpsのかわりにsの値を使用すると良いかと思われる.
後ほど修正予定.
申し訳ないが取り急ぎ報告のみ.


スペクトログラムは横軸時間,縦軸周波数,レベルを色の濃淡で表したグラフである.

任意の周波数で横方向に切り取ったグラフおよび任意の時間で縦方向に切り取ったグラフを描画してみる.


図解するとこんな感じ.

今回はこれらを関数として用意し,mainで呼び出すことにした.

main

% 分析信号としてチャープ信号に白色ノイズを重畳したものを用いる

Fs = 44100;                 % サンプリング周波数(Hz)
T = 10;                     % 信号の時間長さ(秒)
N = Fs * T;                 % 信号のサンプル数

n = randn(1, N);            % N点の白色ノイズ

% 線形チャープ信号の生成
f1 = 5000;                  % 開始周波数
f2 = 15000;                 % 終了周波数
t = ((1:N) - 1) / Fs;       % 周期1/Fs, サンプル数Nの時間配列
s = chirp(t,5000,T,15000);  % チャープ信号の生成


% ノイズとチャープ信号を足し合わせる
SNRdB_original = snr(s,n);  % 元のSN比を求める
SNRdB = -10;                % 設定するSN比
coef = 10^((SNRdB_original - SNRdB)/20);   % SN比を調節するための係数
n = coef * n;               % ノイズパワーを調整

z = s + n;                  % チャープ信号とノイズを重畳する

% STFTする
Nw = 512;                   % 時間窓の長さ
Nol = round(Nw/2);          % オーバーラップ
NFFT = Nw;                  % FFT点数
[~, freq, time, ps] = spectrogram(z,Nw,Nol,NFFT,Fs,'yaxis');


% 周波数-レベルグラフを描く
t = 2;
figure;
plot_freq_level_plane_of_spectrogram(ps, Fs, t);

% 時間-レベルグラフを描く
f = 10*10^3;
figure;
plot_time_level_plane_of_spectrogram(ps, Fs, f);

plot_freq_level_plane_of_spectrogram()

function [] = plot_freq_level_plane_of_spectrogram(ps,Fs,t)
% スペクトログラムの時間t(秒)における周波数-レベル平面を描画する

% 周波数配列の計算
N = size(ps,1);                 % 周波数方向のサイズ
freq = ((1:N)-1)*Fs/N/2/1000;   % 周波数配列(kHz単位)

% 指定時間(秒)における時間-レベルの配列を取得
d_freq = Fs / N;                % 周波数分解能
d_time = 1 / d_freq;            % 時間分解能
time = round(t / d_time);       % 時間軸インデックスを計算
P = ps(:,time);                 % 配列のコピー

% グラフを描画する
P = 10*log10(P);                % 振幅のdBへの変換
plot(freq,P);

% グラフの描画設定
xlabel('周波数(kHz)');        % X軸ラベル
xlim([0, Fs/2/1000]);           % X軸範囲(ナイキスト周波数(kHz)まで)
ylabel('パワー/周波数(dB/Hz)')  % Y軸ラベル
ylim([-60, 0]);                 % Y軸範囲
str = sprintf('周波数-レベルグラフ(t=%0.1f秒)',t);
title(str);                     % タイトル

end

plot_time_level_plane_of_spectrogram()

function [] = plot_time_level_plane_of_spectrogram(ps,Fs,f)
% スペクトログラムの周波数f(Hz)における時間-レベル平面を描画する

% 時間軸配列を計算
N = size(ps,1);                 % 周波数軸方向のサイズ
d_freq = Fs / N;                % 周波数分解能
d_time = 1 / d_freq;            % 時間分解能
N = size(ps,2);                 % 時間軸方向のサイズ
time = ((1:N)-1) * d_time;      % 時間軸配列

% 指定周波数(Hz)における時間-レベルの配列を取得
freq = round(f / d_freq * 2);   % 周波数インデックスを計算
P = ps(freq,:);                 % 配列をコピーする

% グラフを描画する
P = 10*log10(P);                % 振幅のdBへの変換
plot(time,P);

% グラフの描画設定
xlabel('時間(secs)');            % X軸ラベル
xlim([0, (N-1)*d_time]);         % X軸範囲
ylabel('パワー/周波数(dB/Hz)')   % Y軸ラベル
ylim([-60, 0]);                  % Y軸範囲
str = sprintf('時間-レベルグラフ(f=%0.1fkHz)',f/1000);
title(str);                      % タイトル

end

結果


fig.周波数-レベルグラフ(t = 2秒)


fig.時間-レベルグラフ(f = 10kHz)



期待する位置にピークが出ており,正しくグラフが描けたと思われる.