"ファイルの書き込み​に際しデータが切り捨​てられました"と表示​される

25 views (last 30 days)
Kaede
Kaede on 12 Aug 2020
Commented: Kaede on 12 Aug 2020
clear;
[p1,fs]=audioread('40kph_RN.wav');
[p2,fs]=audioread('2000rpm_Knock.wav');
fs=44100;
p2(448512,[1 2]) = [0,0];
%smix=30*p1+p2;
%soundsc(smix,fs)
%filename='mix.wav';
%audiowrite(filename,smix,fs);
Lch_p1=p1(:,1);
Rch_p1=p1(:,2);
Lch_p2=p2(:,1);
Rch_p2=p2(:,2);
smix_Lch=22*Lch_p1+Lch_p2;
%soundsc(smix_Lch,fs)
filename='mix_Lch.wav';
audiowrite(filename,smix_Lch,fs);
smix_Rch=22*Rch_p1+Rch_p2;
%soundsc(smix_Rch,fs)
filename='mix_Rch.wav';
audiowrite(filename,smix_Rch,fs);
fft_p1L=fft(22*Lch_p1);
dB_p1L=mag2db(abs(fft_p1L));
fft_p1R=fft(22*Rch_p1);
dB_p1R=mag2db(abs(fft_p1R));
fft_p2L=fft(Lch_p2);
dB_p2L=mag2db(abs(fft_p2L));
fft_p2R=fft(Rch_p2);
dB_p2R=mag2db(abs(fft_p2R));
f = (0:length(fft_p1L)-1)*fs/length(fft_p1L);
figure(1)
semilogx(f,dB_p2L)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1L)
grid on, hold off
legend('2000rpm.knock','roadnoise');
figure(2)
semilogx(f,dB_p2R)
xlim([0 fs/2])
ylim([-100,100])
xlabel('frequency[Hz]')
ylabel('Magnitude[dB]')
hold on
semilogx(f,dB_p1R)
grid on, hold off
legend('2000rpm.knock','roadnoise');
このようなプログラムを使用してディーゼルエンジンのガラガラといった音に走行騒音を重ねることでガラガラ音を聞こえにくくするという実験を行っています.そのためにLch_p1,Rch_p1に定数をかけます.1kあたりがガラガラ音になるのでこれを消そうとすると100ぐらいかける必要がありますが,"ファイルの書き込みに際しデータが切り捨てられました"と表示され,音が汚く音割れのような現象が起きます.これを防ぐ方法はありますでしょうか.
  1 Comment
Kaede
Kaede on 12 Aug 2020
追加で質問なのですがデータが切り捨てられているということはこの作成した音は原音に忠実に作成されていないということでしょうか.

Sign in to comment.

Answers (1)

Kojiro Saito
Kojiro Saito on 12 Aug 2020
こちらのドキュメントのとおり、audiowriteの書き込み対象のデータ型によって、書き込めるデータの範囲が変わってきます。上記の変数smix_Lchsmix_Rchのデータ型を確認してみてください。
whos smix_Lch
whos smix_Rch
このコマンドのクラスにデータ型が返ってきます。
もしデータ型がuint8の場合は0以上255以下、singleやdoubleの場合は、-1.0以上+1.0以下が書き込めるデータの範囲となります。これ以外の範囲になっていると、データが切り捨てられてしまうので、原音が忠実に作成されていないことになります。
audiowriteをやる前にデータを正規化して範囲に収まるようにしてみてください。
例えば、
smix_Lch = smix_Lch / max(smix_Lch);
audiowrite(filename,smix_Lch,fs);
とか、もしsmix_Lchがマイナスの値を取るなら
smix_Lch = smix_Lch / max(abs(smix_Lch));
audiowrite(filename,smix_Lch,fs);
とかでいかがでしょうか。
  1 Comment
Kaede
Kaede on 12 Aug 2020
斎藤様いつもコメントありがとうございます.
承知いたしました.
先生に聞いたところロードノイズに定数をかけるのではなく,ガラガラ音を小さくしていくことで相対的にロードノイズを大きくできないかと言われましたのでそちらでも検討したいと考えております.

Sign in to comment.

Categories

Find more on Audio Plugin Creation and Hosting in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!