音声で周波数領域に変換するために必要なのですがプログラムがわからないので教えてください。

A 回答 (2件)

失礼。

Operaツールバーから検索すると、余分なものがつくみたいです。

とはいえ、
http://google.co.jp/
に行って、「変形離散コサイン変換」って入力しただけなんですけどね。
http://www.google.co.jp/search?q=%95%CF%8C%60%97 …
↑一応、同じもの。&が区切りなので、全部コピペして飛べなかったら、後ろから&以降を切り離す

参考URL:http://www.google.co.jp/search?q=%95%CF%8C%60%97 …
    • good
    • 0

こんにちは。



 こういうのは、Googleでちょっと検索すれば、いくらでも出てくるんですけどねぇ。。。

http://momonga.t.u-tokyo.ac.jp/~ooura/fftman/
http://www002.upp.so-net.ne.jp/sakai/mp3/16_dct. …

参考URL:http://www.google.com/search?q=%E5%A4%89%E5%BD%A …
    • good
    • 0
この回答へのお礼

返事が遅くなってすみません。回答してくれてありがたいのですが参考URLが見ることができないのでもう一度送ってもらえないでしょうか。お願いします

お礼日時:2003/10/22 12:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qアルゴリズムとデータ構造の本のついて

現在、「珠玉のプログラミング」を読んでいるのですが、書いてある内容が理解しにくいのでもう少し難易度を下げたアルゴリズムとデータ構造の本を探しています。

珠玉のプログラミングを読む前に読んでおいた方がいい本やもう少し難易度が低い本があれば教えて頂けないでしょうか。

ちなみに、以下の書籍で一応学習しました。全て理解は出来ていませんが…

・Javaで学ぶアルゴリズムとデータ構造 Robert Lafore 著 岩谷 宏 訳

ただアルゴリズムとデータ構造について知っているだけでは意味が無いと思い、アルゴリズムをどうやって応用していくかなどが書いてある「珠玉のプログラミング」を読む至りました。

よろしくお願い致します。

Aベストアンサー

ご提示の書籍は両方とも読んだことがなく判断ができないので、あくまでも参考としてお読み下さい。


私が入門レベルの次として読んだ書籍です。いずれもC言語です。

・定本 Cプログラマのためのアルゴリズムとデータ構造
 http://www.amazon.co.jp/gp/product/4797304952/

・Cによる探索プログラミング―基礎から遺伝的アルゴリズムまで
 http://www.amazon.co.jp/C%E3%81%AB%E3%82%88%E3%82%8B%E6%8E%A2%E7%B4%A2%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E9%81%BA%E4%BC%9D%E7%9A%84%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%BE%E3%81%A7-%E4%BC%8A%E5%BA%AD-%E6%96%89%E5%BF%97/dp/4274067300/


あと、頭を鍛えるという意味では、以下の書籍も良いかもしれません

・プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
 http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E8%84%B3%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E9%AB%98%E9%80%9F%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B70%E5%95%8F-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/479814245X/
 解答はRubyで記述されていますが、一問のプログラムは短いですし考え方も記載してありますのでRubyをご存知なくても恐らく問題ないかと思います。

・アルゴリズムパズル ―プログラマのための数学パズル入門
 http://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%83%91%E3%82%BA%E3%83%AB-%E2%80%95%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB%E5%85%A5%E9%96%80-Anany-Levitin/dp/4873116694/
 こちらは解答がなく、考え方(アルゴリズム)のみ記載されています。



もしご興味が湧くようでしたら、書店で現品を確認してみてください。

ご提示の書籍は両方とも読んだことがなく判断ができないので、あくまでも参考としてお読み下さい。


私が入門レベルの次として読んだ書籍です。いずれもC言語です。

・定本 Cプログラマのためのアルゴリズムとデータ構造
 http://www.amazon.co.jp/gp/product/4797304952/

・Cによる探索プログラミング―基礎から遺伝的アルゴリズムまで
 http://www.amazon.co.jp/C%E3%81%AB%E3%82%88%E3%82%8B%E6%8E%A2%E7%B4%A2%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E2%80%95%E5%9F%BA%E7%A4%8...続きを読む

Qn進数を10進数に変換するプログラムがわかりません

整数n(2<=n<=16)とn進数の数字列digitsを与えると10進数に変換して表示するプログラム
関数void base2dec(int n, string digits, int &dec)を使用する

実行例 110101(2)=53
123(8)=83
7ACE(16)=31438
以下はとりあえずつくったみたプログラムです
#include<iostream>
#include<string>
using namespace std;
void base2dec(int n, string digits, int &dec)
{
int i,x=0;
for(i=0; i=digits.size()-1; i++)
{
if(n<10)
{
x=digits[i]-'0';
}
else
{
x=digits[i]-'A'+10;
}
dec=(x*n);
if(cin >> digits[i++])
{
if(n<10)
{
dec=dec+(digits[i++]-'0');
}
else
{
dec=dec+(digits[i++]-'A'+10);
}
}
}
int value = dec;
}

int main()
{
int n,value;
string digits;
cout << "何進数ですか-->";
cin >>n;
cout << "数字列を入力してください-->";
cin >>digits;;
base2dec(n,digits,value);
cout << digits << "(" << n << ")=" << value << endl;
return 0;
}

void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。ちなみにn進数から10進数に直す方法は理解しています。

整数n(2<=n<=16)とn進数の数字列digitsを与えると10進数に変換して表示するプログラム
関数void base2dec(int n, string digits, int &dec)を使用する

実行例 110101(2)=53
123(8)=83
7ACE(16)=31438
以下はとりあえずつくったみたプログラムです
#include<iostream>
#include<string>
using namespace std;
void base2dec(int n, string digits, int &dec)
{
int i,x=0;
for(i=0; i=digits.size()-1; i++)
{
if(n<10)
{
x=digits[i]-'0';
}
else
{
...続きを読む

Aベストアンサー

★アドバイス
>for(i=0; i=digits.size()-1; i++){
 ↑
 この行がおかしいです。
 間違い⇒for(i=0; i=digits.size()-1; i++){
 正しい1⇒for(i=0; i<=digits.size()-1; i++){
 正しい2⇒for(i=0; i<digits.size(); i++){
 ※回答者 No.1 さんのアドバイス通りです。
>void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。
 ↑
 『dec=(x*n);』ここが違う気がします。
 『dec=(dec*n+x);』とすればいいと思いますけど。
>ちなみにn進数から10進数に直す方法は理解しています。
 ↑
 理解しているのなら『dec=(dec*n+x);』となると思いますが…。

その他:
>if(cin >> digits[i++]){ … }
 ↑
 このifブロック内は必要なのか?
 どういう意味。
>int value = dec;
 ↑
 最後のこの行は意味ないね。
 『value』を参照してないし。
 戻してないし。
 そもそも dec が『参照』ですよ。
 http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/node8.html→『ポインタと参照』
 このリンクを読みましょう。
・以上。あと16進などのA~Fは大文字専用ですね。小文字だと上手く変換できませんよ。

参考URL:http://next1.msi.sk.shibaura-it.ac.jp/MULTIMEDIA/CPPPUBLISH/node8.html

★アドバイス
>for(i=0; i=digits.size()-1; i++){
 ↑
 この行がおかしいです。
 間違い⇒for(i=0; i=digits.size()-1; i++){
 正しい1⇒for(i=0; i<=digits.size()-1; i++){
 正しい2⇒for(i=0; i<digits.size(); i++){
 ※回答者 No.1 さんのアドバイス通りです。
>void関数の中、特に計算方法が間違っていると思うのですが、なにがいけないかわかりません。
 ↑
 『dec=(x*n);』ここが違う気がします。
 『dec=(dec*n+x);』とすればいいと思いますけど。
>ちなみにn進数から10進数に直す方法...続きを読む

Q都内でデータ構造とアルゴリズムが勉強出来る所?

聴講生として、データ構造とアルゴリズム又はC++のクラスを取れる大学や教育機関を教えてください!

Aベストアンサー

C++等のプログラム言語自体の講義を手とり足とり教えてくれる大学は無いでしょう。
個人で解説本なり参考書等を購入する、参考サイト等で調べて、自分のペースでプログラムの作成コンパイルデバッグ等を繰り返して身に付ける他ないのではと思われます。

データ構造とアルゴリズム等はある程度講習される事もあるかと思いますが、これもC++等と同じくわざわざ聴講生として教わるよりも自分で調べる方が良いのではないでしょうか。

次等を参考にして下さい。

http://oshiete.goo.ne.jp/qa/7398476.html
情報関連の参考書について

########

それから特定のサイト内に情報がありそうな時は、サイト内サーチを使うと便利です。

http://www.atmarkit.co.jp/ ==>

C++ 入門 OR 初歩 OR 基礎 OR 解説 site:http://www.atmarkit.co.jp/
アルゴリズム OR データ構造 site:atmarkit.co.jp

新しい情報をサーチしたい場合、最終更新日時(googleに更新が確認し収集された日時)を追加すると便利です。
http://www.google.co.jp/advanced_search?hl=ja

&as_qdr=, &tbs=qdr: 等の項目がサーチ条件の中に出てきていた場合は、その内容を次の通りに書き換えます。
サーチ条件内に出てきていない時は最後に追加します。

&as_qdr=all ==> &as_qdr=y    (制限なし ==> 一年以内)
&tbs=qdr:m ==> &tbs=qdr:m6  (一月以内 ==> 6か月以内)

&as_qdr=, &tbs=qdr: の後には次の文字、文字+数値が指定できます。
 y, m, w, d, h, n <==> 年、月、週、日、時間、分 

C++ site:atmarkit.co.jp ==>

https://www.google.co.jp/search?hl=ja&as_q=C%2B%2B+site%3Aatmarkit.co.jp&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=all&as_sitesearch=&as_occt=any&safe=active&as_filetype=&as_rights=

==> 2年以内の情報のみサーチ

https://www.google.co.jp/search?hl=ja&as_q=C%2B%2B+site%3Aatmarkit.co.jp&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=y2&as_sitesearch=&as_occt=any&safe=active&as_filetype=&as_rights=

C++等のプログラム言語自体の講義を手とり足とり教えてくれる大学は無いでしょう。
個人で解説本なり参考書等を購入する、参考サイト等で調べて、自分のペースでプログラムの作成コンパイルデバッグ等を繰り返して身に付ける他ないのではと思われます。

データ構造とアルゴリズム等はある程度講習される事もあるかと思いますが、これもC++等と同じくわざわざ聴講生として教わるよりも自分で調べる方が良いのではないでしょうか。

次等を参考にして下さい。

http://oshiete.goo.ne.jp/qa/7398476.html
情報関連...続きを読む

Qどんなプログラムになるのかわからないのでプログラムを作って頂けませんか

どんなプログラムになるのかわからないのでプログラムを作って頂けませんか?

3分間英単語タイプ練習プログラム作ってを5日以上にわけて計25回以上実行します。

1 単語ファイルword.txtを単語数未知として読み込むこと.3975単語含まれているが,単語数をプログラムに直接書き込むことや実行時に与えることは禁止.
2 単語は一様乱数を用いてランダムに呈示すること.プログラム完成後,プログラムの先頭に「srand((unsigned)time(NULL));」を付加しなさい.これにより,実行時刻によって乱数シードが変わるから,異なった単語(系列)が呈示されることになる.
3 各回の得点は「正答した単語の文字数の総和」とする.
4 毎回「月/日/年-時:分:秒,得点」を結果ファイルscore.csvに追加的に書き込む(追記モード)。秒と得点の間のカンマは半角にする必要があることを注意しておく.

Aベストアンサー

とりあえず使いそうな関数だけ書いておきます。あとは調べてください。

fgets, fseek

とりあえずこれだけで作れる・・・かな?word.txtの中身が分からないですが、一行につき一単語のみが書いてあると仮定するとfgetsをループすれば単語数は求められます。

単語をメモリに格納した方が速度は早くなるのでそのときはfgets, malloc, freeで作れるかと。

ポインタは分かっていますか?
ポインタ分かってないとちょっと厳しいかも・・・

がんばってください。

Qプログラマにとって「アルゴリズム」や「データ構造」の知識は必須ですか?

最近の、いわゆるパッケージソフトウェアや、Webアプリケーションの開発においては、
必要なコンポーネントをインポートして部品を組み立てていくイメージで
コードを書いていくというのが主流だと思います。

ほとんどのプログラミング言語には、すでに便利な関数やパッケージが用意されており、「アルゴリズム」や「データ構造」といった知識はあまり必要になりません。
例えば、データをソートしたい場合、クイックソートなどで自分で実装しなくても、すでにソート関数が用意されているので、その関数を使用すれば良いわけです。

そのような環境においても、プログラマにとって「アルゴリズム」や「データ構造」の知識はやはり必須ですか?

時々、
・「優先順位付き待ち行列」くらいは、スラスラ実装できなければ、プログラマとしては半人前
・「離散数学」をしっかり理解していないと、プログラマとしては致命的
などという話も聞くのですが、皆さんの意見を聞かせてください。

Aベストアンサー

「作る」能力は必要はないかもしれませんが,「使う」ためにはアルゴリズムやデータ構造の存在を知っていて,理解している必要があると思います。

アクセスメソッドを例に取ると,B-treeを使った方がいい場合もあれば,ハッシュを使った方がいい場合もあります。データ集合の性質によっては,インデックス経由よりもフルスキャンした方が効率がいい場合もあります。それぞれのアルゴリズムがどういう原理で動作していて,従ってどういう特性を持っているかを理解していないと,実際に自分が使う段になって,そのアルゴリズムに適したケースなのかそれとも不適当なのか判断できないのではないでしょうか?

データ構造でも同じことで,あるアプリケーションのデータ構造として,ヒープがいいのか,配列がいいのか,リンクトリストがいいのかは,それぞれの構造の成り立ちと特性を理解していないと判断できないのではないかと思います。

ただ,場合によっては,理解しているだけではなく作れることが求められるかもしれません。例えば,使っているデータのフォーマットと,既成の部品が扱えるデータのフォーマットが微妙に違っていることもあります。こうしたケースでは,これらのアルゴリズムやデータ構造を自分で作ることが要求されるでしょう。

いずれにせよ,アルゴリズムやデータ構造の「理解」は,ベースラインとして持っておいたほうがいいように思います。

「作る」能力は必要はないかもしれませんが,「使う」ためにはアルゴリズムやデータ構造の存在を知っていて,理解している必要があると思います。

アクセスメソッドを例に取ると,B-treeを使った方がいい場合もあれば,ハッシュを使った方がいい場合もあります。データ集合の性質によっては,インデックス経由よりもフルスキャンした方が効率がいい場合もあります。それぞれのアルゴリズムがどういう原理で動作していて,従ってどういう特性を持っているかを理解していないと,実際に自分が使う段になって,そ...続きを読む

QVC2005 プログラム領域への書込み制限について

<前提>
VC2005 で、以下のプログラムを実行すると、
エラーメッセージが出力されます。

<エラーメッセージ>
test.exe の 0x004113c9 でハンドルされていない例外
が発生しました: 0xC0000005: 場所 0x004113cb に
書き込み中にアクセス違反が発生しました。

-----------
#include <stdio.h>

void main(void)
{
unsigned long pc_pos;

// PC位置をpc_posへ格納
__asm
{
CALL NXT
NXT:
POP pc_pos;
}

(*(unsigned char*)pc_pos) = 0x3F;

return;
}
-----------

そこで、アセンブラで命令列をみると、
アドレス004113C9の場所で、発生しています。

----------
// 今のPC位置を知るプログラムは?
__asm
{
CALL NXT
004113BE E8 00 00 00 00 call NXT (4113C3h)
NXT:
POP pc_pos;
004113C3 8F 45 F8 pop dword ptr [pc_pos]
}

(*(unsigned char*)pc_pos) = 0x3F;
004113C6 8B 45 F8 mov eax,dword ptr [pc_pos]
004113C9 C6 00 3F mov byte ptr [eax],3Fh

※eaxレジスタには、0x004113c3 が格納されています
----------

さて、ここで質問です。

<質問>
プログラム領域への書込みは、ライトプロテクトされています。
このライトプロテクトを一時的に外す方法はありますでしょうか。

つまり、0x004113c3アドレスに、3Fhを書き込んでも、
エラーが発生しない方法が知りたいです。

> プログラム領域に対する書込み命令コード
004113C9 C6 00 3F mov byte ptr [eax],3Fh

<前提>
VC2005 で、以下のプログラムを実行すると、
エラーメッセージが出力されます。

<エラーメッセージ>
test.exe の 0x004113c9 でハンドルされていない例外
が発生しました: 0xC0000005: 場所 0x004113cb に
書き込み中にアクセス違反が発生しました。

-----------
#include <stdio.h>

void main(void)
{
unsigned long pc_pos;

// PC位置をpc_posへ格納
__asm
{
CALL NXT
NXT:
POP pc_pos;
}

(*(unsigned char*)pc_pos) = 0x3F;

...続きを読む

Aベストアンサー

自己書き換えで検索してみたら、こんなんがでました。
http://f4.aaa.livedoor.jp/~madprog/doc/self-mod.html
本当にうまくいくかどうかは知りません(^^;

Qアルゴリズムとデータ構造についてこの画像の問題がよくわかりませんウが答えみたいなのですが なぜウ

アルゴリズムとデータ構造について
この画像の問題がよくわかりません
ウが答えみたいなのですが なぜウが出力できないのでしょうか?
ウもエと同じように
X②→Y②→Z①→Y③→X③
のようにできないのでしょうか?

Aベストアンサー

②の操作でデータを積み上げ、③の操作で積み上げた一番上のデータを出すので、
X、Yの順で(Xが下、Yが上で)積み上げたデータはY、Xの順でしか出せません。
よって、エが可能でウが不可能となります。
スタックのイメージを「縦にデータを積み上げる」図で考えてみてください。

Q複数プログラムから同一のSRAM領域にアクセス

お世話になります。

[Prog1.c]、[Prog2.c]の2つのプログラムから同じSRAM領域にread/writeを
するプログラムを考えています。
プログラム言語はC言語、OSはLinuxです。

・[Prog1]
 一定周期でSRAM領域を読み込むプログラム。
 SRAM領域のデータに変化があったときにある処理を実行する。
/*********************************************************/
int desc = 0;
char old_ch[256];
char new_ch[256];
for(;;) {
desc = fopen("/dev/rasram", O_RONLY);
read(desc, &new_ch[0], 256);
if(strcmp(old_ch, new_ch)) {

//処理を実行・・・

strcpy(old_ch, new_ch);//古いデータを更新
}
close(desc);
sleep(5);
}
/*********************************************************/

・[Prog2]
 任意のタイミングでSRAM領域にデータを書き込むプログラム。
/*********************************************************/
int desc = 0;
char write_ch[256];

desc = fopen("/dev/rasram", O_WONLY);
write(desc, &write_ch[0], 256);
close(desc);
/*********************************************************/

この時心配なのが、Prog1のreadとProg2writeが同時に発生した場合、プログラムエラー
にならないかということです。
openの状態がわかればいいのですが、別プロセスなのでdescの値も別になるでしょうし。
今までこのようなプログラムを作成したことのある方はいますでしょうか?

お世話になります。

[Prog1.c]、[Prog2.c]の2つのプログラムから同じSRAM領域にread/writeを
するプログラムを考えています。
プログラム言語はC言語、OSはLinuxです。

・[Prog1]
 一定周期でSRAM領域を読み込むプログラム。
 SRAM領域のデータに変化があったときにある処理を実行する。
/*********************************************************/
int desc = 0;
char old_ch[256];
char new_ch[256];
for(;;) {
desc = fopen("/dev/rasram", O_RONLY);
read(desc, &new_ch[0], 256);
if(strcmp(old_ch, ...続きを読む

Aベストアンサー

ANo.2さんの回答の排他制御が普通だと思いますが、逆の両方で使うモードもありますので調べてみてください。

shared mode のオープンで私が知っているのは _fsopen() ですが(だったと思いますが、間違いかも)、お使いのC/C++でサポートされているか調べてみてください。

Qデータ構造とアルゴリズムの問題が分かりません。

以下の問題で悩んでいます。

1 配列とリストでデータを末尾に追加する場合の時間計算量をO記法で表せ。

2 配列とリスト、それぞれの時間計算量以外の利点と欠点をなるべく多く挙げよ。

3 データ構造「スタック」、「キュー」を配列もしくはリストで実現した場合、それぞれの利点と欠点を挙げよ。

4 アルゴリズム「線形探索」、「二分探索」で特定のデータを検索するための時間計算量をO記法で表し、またその理由も記述せよ。

5 データを検索する操作のほうが多い場合と、データを追加する操作が多い場   合、 「線形探索」と「二分探索」どちらが有利か理由をつけて述べよ。

1は、挿入と削除はO記法で表せたのですが、追加が分かりませんでした。

2は配列の利点はランダムアクセス可能な点と任意のデータをすぐに扱える点の2点 リストの利点は扱うデータを自由に変えられる点の1点しか思いつかず、欠点はよく分かりませんでした。

3、4、5も理由をつけて説明しろと言われたら無理です。

テストに類題を出すと先生はおっしゃってたので、どうしてもすぐに回答が必要です。先生にも質問したのですが、テストに類題を出すから教えられない。自力で頑張れと言われ困っています。 どなたか御助力よろしくお願いいたします。

以下の問題で悩んでいます。

1 配列とリストでデータを末尾に追加する場合の時間計算量をO記法で表せ。

2 配列とリスト、それぞれの時間計算量以外の利点と欠点をなるべく多く挙げよ。

3 データ構造「スタック」、「キュー」を配列もしくはリストで実現した場合、それぞれの利点と欠点を挙げよ。

4 アルゴリズム「線形探索」、「二分探索」で特定のデータを検索するための時間計算量をO記法で表し、またその理由も記述せよ。

5 データを検索する操作のほうが多い場合と、データを追加す...続きを読む

Aベストアンサー

1 配列とリストでデータを末尾に追加する場合の時間計算量をO記法で表せ。
配列 O(n)
リストO(1)

2 配列とリスト、それぞれの時間計算量以外の利点と欠点をなるべく多く挙げよ。
配列は一般にサイズ固定ですが、リストは一般にサイズ可変です。
実装方法にもよりますが、普通配列の方が構造・アルゴリズムが単純ですので、高速でメモリ消費量が少ないです。
リストでは、動的なメモリ管理(malloc/free)を使うことが多いので、
アルゴリズムがやや複雑で、速度・メモリ消費量の点では若干不利かもしれません。
逆にリストのほうが、多様なデータへの対応をしやすく、柔軟性が高いと言えるでしょう。


3 データ構造「スタック」、「キュー」を配列もしくはリストで実現した場合、それぞれの利点と欠点を挙げよ。
双方向リストを用いるのであれば、先頭に対する挿入・削除、末尾に対する挿入・削除は1stepで行えます。
キューの実現にリストを用いれば、キューへの追加・キューからの取り出しは簡単にできます。
キューの実現に配列を用いると、先頭要素を取り出す毎に、配列全要素のシフトが必要になるため、非効率です。

スタックは普通、末尾へのpush,popのみ許可するため、上の問題は生じず、配列でも問題はないと思います。
強いていうならば、配列はサイズ固定ですから、スタックに必要なサイズが見積もれない場合は不便でしょう。

4 アルゴリズム「線形探索」、「二分探索」で特定のデータを検索するための時間計算量をO記法で表し、またその理由も記述せよ。
※ 探索対象のサイズをNとします。
(線形探索) O(N) 前から順番に調べていくと、平均でN/2回で探索対象を発見できるため。
(二分探索) O(log N) 1回の探索毎に探索範囲を半分に絞り込むことができます。
そのため、探索対象のサイズが2倍になっても、探索回数は平均で1回のみ増加します。
よって、探索回数はlog_2 N(底2のlog)と見積もることができます。

5 データを検索する操作のほうが多い場合と、データを追加する操作が多い場合、 「線形探索」と「二分探索」どちらが有利か理由をつけて述べよ。
データ構造に双方向リストを用いるとします(末尾への追加はO(1))。
(検索が多い)二分探索 新しいデータはリストの順序(昇順・降順)が保たれるような位置に挿入します。
その位置は二分探索で見つけます。
こうしておけば、後でデータを検索する時に二分探索を用いることができますので、
挿入は低速ですが、検索は高速です。
(追加が多い)線形探索 新しいデータはとりあえずリスト最後尾に追加します。
検索が必要な場合はリスト先頭から順に探します。
双方向リストでは、リスト末尾への追加はO(1)ですので、データの追加は高速です。
一方、データはでたらめな順序で並んでしまうので、検索は線形探索で行うしかなく、低速です。

1 配列とリストでデータを末尾に追加する場合の時間計算量をO記法で表せ。
配列 O(n)
リストO(1)

2 配列とリスト、それぞれの時間計算量以外の利点と欠点をなるべく多く挙げよ。
配列は一般にサイズ固定ですが、リストは一般にサイズ可変です。
実装方法にもよりますが、普通配列の方が構造・アルゴリズムが単純ですので、高速でメモリ消費量が少ないです。
リストでは、動的なメモリ管理(malloc/free)を使うことが多いので、
アルゴリズムがやや複雑で、速度・メモリ消費量の点では若干不利かもしれ...続きを読む

QFFTを使って信号を周波数変換する方法を教えてください。

音信号を周波数変換するプログラムを作成しています。

FFTを使って実現しようとしているのですが、うまくいきません。

現時点で作った方法では、
(1)FFTする。結果は配列x_re[NFFT]、x_im[NFFT]に格納。(x_re:実数部 x_im:虚数部 NFFT:ポイント数、配列の内容としては周波数の低い順に結果データが並んでいる)
(2) x_re,x_imの内容をずらす。(例えば以下のように配列内容を1つずらせばIFFTをした時周波数が高くなるはず)
for(i=0;i<NFFT-1;i++){
x_re[i+1]=x_re[i];
x_im[i+1]=x_im[i];
}
(3)配列x_re[NFFT]、x_im[NFFT]に対しIFFTする。

FFT・IFFTが正しく動作するのは確認しています。
(動作実績も結構あります。(2)を省略し(1)(3)だけとすれば出力結果は入力結果と同じ(出力音声を聴いた感じで)になるので、正しく動作していると思います。)
よって(2)が間違っていると思います。

(2)をどのようにすれば周波数変換できるのか教えてください。また今の所FFTを使おうとしているのですが、別に入力信号を周波数変換できればOK(周波数を上げたり下げたりしたい)なので、その方法があれば教えてください(><)

音信号を周波数変換するプログラムを作成しています。

FFTを使って実現しようとしているのですが、うまくいきません。

現時点で作った方法では、
(1)FFTする。結果は配列x_re[NFFT]、x_im[NFFT]に格納。(x_re:実数部 x_im:虚数部 NFFT:ポイント数、配列の内容としては周波数の低い順に結果データが並んでいる)
(2) x_re,x_imの内容をずらす。(例えば以下のように配列内容を1つずらせばIFFTをした時周波数が高くなるはず)
for(i=0;i<NFFT-1;i++){
x_re[i+1]=x_re[i];
x_im[i+1]=x_im[i]...続きを読む

Aベストアンサー

配列をずらすと周波数は高くなるでしょうが、音は不自然になるはずです。足し算ではなく掛算で考えるべきだと思います。
たとえば、1kHzと2kHzがあって、これはちょうど倍音関係(1オクターブ上)になっていますが、足し算(+0.2kHz)だと1.2kHzと2.2kHzで不協和音になりますよね。掛算(*1.2)ならば1.2kHzと2.4kHzで倍音関係は維持したままです。

僕は専門家ではないのであまり詳しくないですが、周波数シフトではいろいろ気をつけることがあるみたいです。
FFTでは周波数の間隔が一定ですので、掛算で求めた周波数はちょうどグリッド上にくることはありません。
これは、掛算する前の周波数も本当の周波数ではなくて、最寄のグリッド上にでていることを意味します。
周波数シフトのようなデリケートな処理の場合、周波数の誤差は致命的ですので、補正処理が必要です。
補正方法は、位相差計測法とかいろいろあるようです。。


人気Q&Aランキング

おすすめ情報