ブログ始めました!!!!!!!!!!!!!!

この記事はrogy Advent Calender 201920日目の記事です。

こんにちは。痕鯖といいます。

これを機にブログをはじめようかと思い立って、実際にはじめました。おわり。

と行きたいところですが、折角なのでMATLABの小ネタを二つくらい披露したいと思います。

歌からメインボーカルだけ取り出す

先ず曲を読み込みます。 onvocalにはメインボーカルが入ったやつ、offvocalには入ってないやつを入れます。

[onvocal,fs] = audioread('01 秘密のトワレ.flac');
offvocal = audioread('03 秘密のトワレ (オリジナル・カラオケ).flac');

下の関数に入れます。

function y = vocalcut(onvocal,offvocal,fs)

t = 2*fs; %最初2秒分だけ見る
a = onvocal(1:t,1);
b = offvocal(1:t,1);
[c,d] = xcorr(a,b);
[~,ind] = max(abs(c));
lag = d(ind)
if lag>0 %ズレの正負でonvocalとoffvocalのどっちをずらすか
    y1 = onvocal(lag+1:end,:);
    if length(y1)>length(offvocal)
        y1 = y1(1:length(offvocal),:);
        y2 = offvocal;
    else
        y2 = offvocal(1:length(y1),:);
    end
else
    y2 = offvocal(abs(lag)+1:end,:);
    if length(y2)>length(onvocal)
        y2 = y2(1:length(onvocal),:);
        y1 = onvocal;
    else
        y1 = onvocal(1:length(y2),:);
    end
end
y = y1-y2;

end

ボーカルだけ取り出すのにvocalcutってどうなの?と思ったときには作り終わってたので気に入らなかったら変えてください。

出てきたやつを再生します。

sound(y,fs); % clear soundでとまります。

やってることとしては、onvocalとoffvocalのイントロの部分(ここでは簡単のため最初の2秒分だけ)を比較してズレを計算して、onvocalからoffvocalを引けば多分ボーカルだけ取り出せるだろうという感じです。

あまり考えていないので、例えば最初アカペラから始まる曲とか多分失敗します。

多項式グレブナー基底を使って解いてみる

グレブナー基底って何?みたいな詳しいことは書きません(書けません)。何やってるか知りたいよ、という方には『グレブナ基底と代数多様体入門』という本をおすすめしておきます。

今回は解きたい問題として「辺の長さの合計が2の三角形の中で一番面積が大きいのは何?」というのを考えます。

とりあえずコードをはります。a, b, cは各辺の長さでlambdaはラグランジュの未定乗数です。

ここではただ多項式を解きたいだけなので、何かしらわからなくてもとりあえず「こーゆう風に多項式解けるんだ~」という感じでお願いします。

syms a b c lambda real % 変数たち
f = (1-a)*(1-b)*(1-c); % 三角形の面積(ヘロンの公式)
g = a+b+c-2; % 辺の長さは合計で2という制約(g=0)
h = [gradient(f)-lambda*gradient(g); g] % 解きたい多項式(全部"左辺=0"のカタチの左辺)
G = gbasis(h.', 'MonomialOrder', 'lex') % (簡約された)グレブナー基底
kotae = solve(G); % 上の行で出てきた多項式を解く(実はsolve(h)で解ける)
disp(kotae.a);disp(kotae.b);disp(kotae.c);disp(kotae.lambda); % コタエを表示

大事なのは5行目で、Gは多分hよりも簡単になったやつ(一番下はlambdaだけの式)になってるはずです。

おわりに

ここまで読んでいただきありがとうございました。これからも日記的なものをチョビチョビ更新していけたらな~と思っています。