SewiGの日記
2005-05-28 [土]
2006-05-28 [日]
■ [Programming] X11プログラミングメモ(2)
次に描画。これでおもしろいアプリケーションも作れるでしょう。
#include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
Display *display;
Window root, window;
int screen;
XEvent event;
KeySym key;
GC gc;
unsigned long GetColor(Display *display, char *color) {
Colormap cmap;
XColor c0, c1;
cmap = DefaultColormap(display, 0);
XAllocNamedColor (display, cmap, color, &c1, &c0);
return (c1.pixel);
}
int main(int argc, char *argv[]) {
display = XOpenDisplay(NULL);
screen = DefaultScreen(display);
root = RootWindow(display, screen);
window = XCreateSimpleWindow(display, root, 100, 100, 640, 480, 4, BlackPixel(display, screen), WhitePixel(display, window));
XStoreName(display, window, "Hello, X11 world");
Atom atom1, atom2;
atom1 = XInternAtom(display, "WM_PROTOCOLS", False);
atom2 = XInternAtom(display, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, window, &atom2, 1);
XMapWindow(display, window);
XFlush(display);
XSelectInput(display, window, ExposureMask | KeyPressMask | ButtonPressMask);
gc = XCreateGC(display, window, 0, 0);
XSetForeground(display, gc, GetColor(display, "black"));
XSetBackground(display, gc, GetColor(display, "white"));
for(;;) {
XNextEvent(display, &event);
switch (event.type) {
case Expose:
XDrawImageString(display, window, gc, 20, 50, "Hello", 5);
XDrawLine(display, window, gc, 0, 0, 100, 100);
XDrawPoint(display, window, gc, 20, 50);
XDrawRectangle(display, window, gc, 80, 70, 50, 50);
XFillRectangle(display, window, gc, 180, 170, 50, 50);
XDrawArc(display, window, gc, 200, 200, 50, 50, 0, 360*64);
XFillArc(display, window, gc, 250, 250, 50, 50, 0, 360*64);
break;
case KeyPress:
key = XKeycodeToKeysym(display, event.xkey.keycode, 0);
if (key == XK_q) {
XDestroyWindow(display, window);
XCloseDisplay(display);
exit(0);
}
break;
case ButtonPressMask:
XDestroyWindow(display, window);
XCloseDisplay(display);
exit(0);
break;
case ClientMessage:
if (event.xclient.message_type == atom1 && event.xclient.data.l[0] == atom2){
XDestroyWindow(display, window);
XCloseDisplay(display);
exit(0);
}
}
}
}
まず、#include <X11/keysym.h>とKeySymはキー入力で必要です。
そして、GCは描画に必要なものです。グラフィックコンテキスト。XCreateGC()を使用して取得します。GCさえあれば、あとは簡単。XSetForeground()で色を指定して、描画関数で描くだけです。このときXColorでRGB値を1つずつ指定するのが面倒なので、GetColorで名前を指定します。描画関数にはXDrawImageString、XDrawLine、XDrawPoint、XDrawRectangle、XDrawArcなどがあります。DrawをFillにした関数もあって、そっちは塗りつぶせます。あとはメモリ内での画像を扱うPixmapとか転送のXCopyArea()とか。
これで、タイマ回して画像でも表示させれば面白そうなアプリケーションが作れそうですね。音声はそのうち。
2007-05-28 [月]
■ [MATLAB] リサンプリング (2)
アップサンプリング
アップサンプリングとは、ある周波数でサンプリングされた信号をそれよりも高い周波数でリサンプリングすることです。例えば、48kHzでサンプリングされた信号を96kHzでリサンプリングすることです。
アップサンプリングの原理はデータの補間。例えば、1サンプルおきに0を追加すると、サンプリング周波数は2倍になります。しかし、このままでは高調波を含む信号になりますよね。なので、サンプリング周波数の1/4を遮断周波数とするローパスフィルタ(LPF)で高周波を遮断して、不必要な高調波を防ぐことができます。また、0を挿入するとアップサンプリング後の振幅が小さくなるため、ゲインを調整して2倍に。
clear;
% 入力信号
[x,fs,bits]=wavread('input.wav');
fc=fs/4;
% 入力信号の波形
figure(1);
plot(x(1:100));
% アップサンプリング(fsを2倍に)
length_x=length(x);
x2=zeros(1,length_x*2);
for n=1:length_x
x2(n*2-1)=x(n);
end
% アップサンプリングした信号
figure(2);
plot(x2(1:200));
% LPF作成
[b,a]=butter(2,fc/(fs/2));
% LPFの周波数特性
figure(3);
freqz(b,a,fs,fs/4);
% 入力信号をLPFに通す
y=filter(b,a,x2);
% LPFに通した信号の表示
figure(4);
plot(y(1:200));
% ゲイン調整
y=y.*2;
% 書き出し
wavwrite(y,fs*2,'output.wav');
アップサンプリングも、実際にはMATLABのSignal Processing Toolboxに既にリサンプリングできる関数が用意されているので使いましょう。詳しくはhelpで確認を。
clear;
% 入力信号
[x,fs,bits]=wavread('input.wav');
fc=fs/4;
% 入力信号の波形
figure(1);
plot(x(1:100));
% リサンプリング
y = resample(x,2,1)
% アップサンプリングした信号
figure(2);
plot(y(1:200));
% 書き出し
wavwrite(y,fs*2,'output.wav');
● Rhzmwbfq [I mean, of course.It is worth noting this is that you've h..]